'string', 'text' => 'string', 'blob' => 'string', 'guid' => 'string', 'integer' => 'integer', 'smallint' => 'integer', 'bigint' => 'integer', 'datetime' => 'DateTime', 'datetimetz' => 'DateTime', 'time' => 'DateTime', 'date' => 'DateTime', 'float' => 'float', 'decimal' => 'float', 'boolean' => 'boolean', 'array' => 'array', 'json_array' => 'array', 'simple_array' => 'array', ]; /** * @var DriverInterface */ protected $delegate; /** * @var ManagerRegistry */ protected $registry; /** * @var ParserInterface */ protected $typeParser; public function __construct(DriverInterface $delegate, ManagerRegistry $registry, ?ParserInterface $typeParser = null) { $this->delegate = $delegate; $this->registry = $registry; $this->typeParser = $typeParser ?: new Parser(); } public function loadMetadataForClass(\ReflectionClass $class): ?BaseClassMetadata { /** @var ClassMetadata $classMetadata */ $classMetadata = $this->delegate->loadMetadataForClass($class); // Abort if the given class is not a mapped entity if (!$doctrineMetadata = $this->tryLoadingDoctrineMetadata($class->name)) { return $classMetadata; } $this->setDiscriminator($doctrineMetadata, $classMetadata); // We base our scan on the internal driver's property list so that we // respect any internal white/blacklisting like in the AnnotationDriver foreach ($classMetadata->propertyMetadata as $key => $propertyMetadata) { /** @var $propertyMetadata PropertyMetadata */ // If the inner driver provides a type, don't guess anymore. if ($propertyMetadata->type || $this->isVirtualProperty($propertyMetadata)) { continue; } if ($this->hideProperty($doctrineMetadata, $propertyMetadata)) { unset($classMetadata->propertyMetadata[$key]); } $this->setPropertyType($doctrineMetadata, $propertyMetadata); } return $classMetadata; } private function isVirtualProperty(PropertyMetadata $propertyMetadata): bool { return $propertyMetadata instanceof VirtualPropertyMetadata || $propertyMetadata instanceof StaticPropertyMetadata || $propertyMetadata instanceof ExpressionPropertyMetadata; } protected function setDiscriminator(DoctrineClassMetadata $doctrineMetadata, ClassMetadata $classMetadata): void { } protected function hideProperty(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata): bool { return false; } protected function setPropertyType(DoctrineClassMetadata $doctrineMetadata, PropertyMetadata $propertyMetadata): void { } protected function tryLoadingDoctrineMetadata(string $className): ?DoctrineClassMetadata { if (!$manager = $this->registry->getManagerForClass($className)) { return null; } if ($manager->getMetadataFactory()->isTransient($className)) { return null; } return $manager->getClassMetadata($className); } protected function normalizeFieldType(string $type): ?string { if (!isset($this->fieldMapping[$type])) { return null; } return $this->fieldMapping[$type]; } }