vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php line 167

Open in your IDE?
  1. <?php
  2. namespace Doctrine\DBAL\Types;
  3. use Doctrine\DBAL\DBALException;
  4. use Doctrine\DBAL\ParameterType;
  5. use Doctrine\DBAL\Platforms\AbstractPlatform;
  6. use function end;
  7. use function explode;
  8. use function str_replace;
  9. /**
  10.  * The base class for so-called Doctrine mapping types.
  11.  *
  12.  * A Type object is obtained by calling the static {@link getType()} method.
  13.  */
  14. abstract class Type
  15. {
  16.     public const TARRAY               'array';
  17.     public const SIMPLE_ARRAY         'simple_array';
  18.     public const JSON_ARRAY           'json_array';
  19.     public const JSON                 'json';
  20.     public const BIGINT               'bigint';
  21.     public const BOOLEAN              'boolean';
  22.     public const DATETIME             'datetime';
  23.     public const DATETIME_IMMUTABLE   'datetime_immutable';
  24.     public const DATETIMETZ           'datetimetz';
  25.     public const DATETIMETZ_IMMUTABLE 'datetimetz_immutable';
  26.     public const DATE                 'date';
  27.     public const DATE_IMMUTABLE       'date_immutable';
  28.     public const TIME                 'time';
  29.     public const TIME_IMMUTABLE       'time_immutable';
  30.     public const DECIMAL              'decimal';
  31.     public const INTEGER              'integer';
  32.     public const OBJECT               'object';
  33.     public const SMALLINT             'smallint';
  34.     public const STRING               'string';
  35.     public const TEXT                 'text';
  36.     public const BINARY               'binary';
  37.     public const BLOB                 'blob';
  38.     public const FLOAT                'float';
  39.     public const GUID                 'guid';
  40.     public const DATEINTERVAL         'dateinterval';
  41.     /**
  42.      * Map of already instantiated type objects. One instance per type (flyweight).
  43.      *
  44.      * @var self[]
  45.      */
  46.     private static $_typeObjects = [];
  47.     /**
  48.      * The map of supported doctrine mapping types.
  49.      *
  50.      * @var string[]
  51.      */
  52.     private static $_typesMap = [
  53.         self::TARRAY => ArrayType::class,
  54.         self::SIMPLE_ARRAY => SimpleArrayType::class,
  55.         self::JSON_ARRAY => JsonArrayType::class,
  56.         self::JSON => JsonType::class,
  57.         self::OBJECT => ObjectType::class,
  58.         self::BOOLEAN => BooleanType::class,
  59.         self::INTEGER => IntegerType::class,
  60.         self::SMALLINT => SmallIntType::class,
  61.         self::BIGINT => BigIntType::class,
  62.         self::STRING => StringType::class,
  63.         self::TEXT => TextType::class,
  64.         self::DATETIME => DateTimeType::class,
  65.         self::DATETIME_IMMUTABLE => DateTimeImmutableType::class,
  66.         self::DATETIMETZ => DateTimeTzType::class,
  67.         self::DATETIMETZ_IMMUTABLE => DateTimeTzImmutableType::class,
  68.         self::DATE => DateType::class,
  69.         self::DATE_IMMUTABLE => DateImmutableType::class,
  70.         self::TIME => TimeType::class,
  71.         self::TIME_IMMUTABLE => TimeImmutableType::class,
  72.         self::DECIMAL => DecimalType::class,
  73.         self::FLOAT => FloatType::class,
  74.         self::BINARY => BinaryType::class,
  75.         self::BLOB => BlobType::class,
  76.         self::GUID => GuidType::class,
  77.         self::DATEINTERVAL => DateIntervalType::class,
  78.     ];
  79.     /**
  80.      * Prevents instantiation and forces use of the factory method.
  81.      */
  82.     final private function __construct()
  83.     {
  84.     }
  85.     /**
  86.      * Converts a value from its PHP representation to its database representation
  87.      * of this type.
  88.      *
  89.      * @param mixed            $value    The value to convert.
  90.      * @param AbstractPlatform $platform The currently used database platform.
  91.      *
  92.      * @return mixed The database representation of the value.
  93.      */
  94.     public function convertToDatabaseValue($valueAbstractPlatform $platform)
  95.     {
  96.         return $value;
  97.     }
  98.     /**
  99.      * Converts a value from its database representation to its PHP representation
  100.      * of this type.
  101.      *
  102.      * @param mixed            $value    The value to convert.
  103.      * @param AbstractPlatform $platform The currently used database platform.
  104.      *
  105.      * @return mixed The PHP representation of the value.
  106.      */
  107.     public function convertToPHPValue($valueAbstractPlatform $platform)
  108.     {
  109.         return $value;
  110.     }
  111.     /**
  112.      * Gets the default length of this type.
  113.      *
  114.      * @deprecated Rely on information provided by the platform instead.
  115.      *
  116.      * @return int|null
  117.      */
  118.     public function getDefaultLength(AbstractPlatform $platform)
  119.     {
  120.         return null;
  121.     }
  122.     /**
  123.      * Gets the SQL declaration snippet for a field of this type.
  124.      *
  125.      * @param mixed[]          $fieldDeclaration The field declaration.
  126.      * @param AbstractPlatform $platform         The currently used database platform.
  127.      *
  128.      * @return string
  129.      */
  130.     abstract public function getSQLDeclaration(array $fieldDeclarationAbstractPlatform $platform);
  131.     /**
  132.      * Gets the name of this type.
  133.      *
  134.      * @return string
  135.      *
  136.      * @todo Needed?
  137.      */
  138.     abstract public function getName();
  139.     /**
  140.      * Factory method to create type instances.
  141.      * Type instances are implemented as flyweights.
  142.      *
  143.      * @param string $name The name of the type (as returned by getName()).
  144.      *
  145.      * @return \Doctrine\DBAL\Types\Type
  146.      *
  147.      * @throws DBALException
  148.      */
  149.     public static function getType($name)
  150.     {
  151.         if (! isset(self::$_typeObjects[$name])) {
  152.             if (! isset(self::$_typesMap[$name])) {
  153.                 throw DBALException::unknownColumnType($name);
  154.             }
  155.             self::$_typeObjects[$name] = new self::$_typesMap[$name]();
  156.         }
  157.         return self::$_typeObjects[$name];
  158.     }
  159.     /**
  160.      * Adds a custom type to the type map.
  161.      *
  162.      * @param string $name      The name of the type. This should correspond to what getName() returns.
  163.      * @param string $className The class name of the custom type.
  164.      *
  165.      * @return void
  166.      *
  167.      * @throws DBALException
  168.      */
  169.     public static function addType($name$className)
  170.     {
  171.         if (isset(self::$_typesMap[$name])) {
  172.             throw DBALException::typeExists($name);
  173.         }
  174.         self::$_typesMap[$name] = $className;
  175.     }
  176.     /**
  177.      * Checks if exists support for a type.
  178.      *
  179.      * @param string $name The name of the type.
  180.      *
  181.      * @return bool TRUE if type is supported; FALSE otherwise.
  182.      */
  183.     public static function hasType($name)
  184.     {
  185.         return isset(self::$_typesMap[$name]);
  186.     }
  187.     /**
  188.      * Overrides an already defined type to use a different implementation.
  189.      *
  190.      * @param string $name
  191.      * @param string $className
  192.      *
  193.      * @return void
  194.      *
  195.      * @throws DBALException
  196.      */
  197.     public static function overrideType($name$className)
  198.     {
  199.         if (! isset(self::$_typesMap[$name])) {
  200.             throw DBALException::typeNotFound($name);
  201.         }
  202.         if (isset(self::$_typeObjects[$name])) {
  203.             unset(self::$_typeObjects[$name]);
  204.         }
  205.         self::$_typesMap[$name] = $className;
  206.     }
  207.     /**
  208.      * Gets the (preferred) binding type for values of this type that
  209.      * can be used when binding parameters to prepared statements.
  210.      *
  211.      * This method should return one of the {@link \Doctrine\DBAL\ParameterType} constants.
  212.      *
  213.      * @return int
  214.      */
  215.     public function getBindingType()
  216.     {
  217.         return ParameterType::STRING;
  218.     }
  219.     /**
  220.      * Gets the types array map which holds all registered types and the corresponding
  221.      * type class
  222.      *
  223.      * @return string[]
  224.      */
  225.     public static function getTypesMap()
  226.     {
  227.         return self::$_typesMap;
  228.     }
  229.     /**
  230.      * @deprecated Relying on string representation is discouraged and will be removed in DBAL 3.0.
  231.      *
  232.      * @return string
  233.      */
  234.     public function __toString()
  235.     {
  236.         $e explode('\\', static::class);
  237.         return str_replace('Type'''end($e));
  238.     }
  239.     /**
  240.      * Does working with this column require SQL conversion functions?
  241.      *
  242.      * This is a metadata function that is required for example in the ORM.
  243.      * Usage of {@link convertToDatabaseValueSQL} and
  244.      * {@link convertToPHPValueSQL} works for any type and mostly
  245.      * does nothing. This method can additionally be used for optimization purposes.
  246.      *
  247.      * @return bool
  248.      */
  249.     public function canRequireSQLConversion()
  250.     {
  251.         return false;
  252.     }
  253.     /**
  254.      * Modifies the SQL expression (identifier, parameter) to convert to a database value.
  255.      *
  256.      * @param string $sqlExpr
  257.      *
  258.      * @return string
  259.      */
  260.     public function convertToDatabaseValueSQL($sqlExprAbstractPlatform $platform)
  261.     {
  262.         return $sqlExpr;
  263.     }
  264.     /**
  265.      * Modifies the SQL expression (identifier, parameter) to convert to a PHP value.
  266.      *
  267.      * @param string           $sqlExpr
  268.      * @param AbstractPlatform $platform
  269.      *
  270.      * @return string
  271.      */
  272.     public function convertToPHPValueSQL($sqlExpr$platform)
  273.     {
  274.         return $sqlExpr;
  275.     }
  276.     /**
  277.      * Gets an array of database types that map to this Doctrine type.
  278.      *
  279.      * @return string[]
  280.      */
  281.     public function getMappedDatabaseTypes(AbstractPlatform $platform)
  282.     {
  283.         return [];
  284.     }
  285.     /**
  286.      * If this Doctrine Type maps to an already mapped database type,
  287.      * reverse schema engineering can't tell them apart. You need to mark
  288.      * one of those types as commented, which will have Doctrine use an SQL
  289.      * comment to typehint the actual Doctrine Type.
  290.      *
  291.      * @return bool
  292.      */
  293.     public function requiresSQLCommentHint(AbstractPlatform $platform)
  294.     {
  295.         return false;
  296.     }
  297. }