| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- <?php
- declare(strict_types=1);
- /**
- * CakePHP(tm) : Rapid Development Framework (https://cakephp.org)
- * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
- *
- * Licensed under The MIT License
- * For full copyright and license information, please see the LICENSE.txt
- * Redistributions of files must retain the above copyright notice.
- *
- * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org)
- * @link https://cakephp.org CakePHP(tm) Project
- * @since 4.0.0
- * @license https://opensource.org/licenses/mit-license.php MIT License
- */
- namespace Cake\Database;
- use InvalidArgumentException;
- /**
- * Factory for building database type classes.
- */
- class TypeFactory
- {
- /**
- * List of supported database types. A human readable
- * identifier is used as key and a complete namespaced class name as value
- * representing the class that will do actual type conversions.
- *
- * @var string[]
- */
- protected static $_types = [
- 'tinyinteger' => Type\IntegerType::class,
- 'smallinteger' => Type\IntegerType::class,
- 'integer' => Type\IntegerType::class,
- 'biginteger' => Type\IntegerType::class,
- 'binary' => Type\BinaryType::class,
- 'binaryuuid' => Type\BinaryUuidType::class,
- 'boolean' => Type\BoolType::class,
- 'date' => Type\DateType::class,
- 'datetime' => Type\DateTimeType::class,
- 'decimal' => Type\DecimalType::class,
- 'float' => Type\FloatType::class,
- 'json' => Type\JsonType::class,
- 'string' => Type\StringType::class,
- 'text' => Type\StringType::class,
- 'time' => Type\TimeType::class,
- 'timestamp' => Type\DateTimeType::class,
- 'uuid' => Type\UuidType::class,
- ];
- /**
- * Contains a map of type object instances to be reused if needed.
- *
- * @var \Cake\Database\TypeInterface[]
- */
- protected static $_builtTypes = [];
- /**
- * Returns a Type object capable of converting a type identified by name.
- *
- * @param string $name type identifier
- * @throws \InvalidArgumentException If type identifier is unknown
- * @return \Cake\Database\TypeInterface
- */
- public static function build(string $name): TypeInterface
- {
- if (isset(static::$_builtTypes[$name])) {
- return static::$_builtTypes[$name];
- }
- if (!isset(static::$_types[$name])) {
- throw new InvalidArgumentException(sprintf('Unknown type "%s"', $name));
- }
- /** @var \Cake\Database\TypeInterface */
- return static::$_builtTypes[$name] = new static::$_types[$name]($name);
- }
- /**
- * Returns an arrays with all the mapped type objects, indexed by name.
- *
- * @return \Cake\Database\TypeInterface[]
- */
- public static function buildAll(): array
- {
- $result = [];
- foreach (static::$_types as $name => $type) {
- $result[$name] = static::$_builtTypes[$name] ?? static::build($name);
- }
- return $result;
- }
- /**
- * Set TypeInterface instance capable of converting a type identified by $name
- *
- * @param string $name The type identifier you want to set.
- * @param \Cake\Database\TypeInterface $instance The type instance you want to set.
- * @return void
- */
- public static function set(string $name, TypeInterface $instance): void
- {
- static::$_builtTypes[$name] = $instance;
- }
- /**
- * Registers a new type identifier and maps it to a fully namespaced classname.
- *
- * @param string $type Name of type to map.
- * @param string $className The classname to register.
- * @return void
- */
- public static function map(string $type, string $className): void
- {
- static::$_types[$type] = $className;
- unset(static::$_builtTypes[$type]);
- }
- /**
- * Set type to classname mapping.
- *
- * @param string[] $map List of types to be mapped.
- * @return void
- */
- public static function setMap(array $map): void
- {
- static::$_types = $map;
- static::$_builtTypes = [];
- }
- /**
- * Get mapped class name for given type or map array.
- *
- * @param string|null $type Type name to get mapped class for or null to get map array.
- * @return array|string|null Configured class name for given $type or map array.
- */
- public static function getMap(?string $type = null)
- {
- if ($type === null) {
- return static::$_types;
- }
- return static::$_types[$type] ?? null;
- }
- /**
- * Clears out all created instances and mapped types classes, useful for testing
- *
- * @return void
- */
- public static function clear(): void
- {
- static::$_types = [];
- static::$_builtTypes = [];
- }
- }
|