From 05e38eadbeb3de19e5b26003c2b401e00bb71df4 Mon Sep 17 00:00:00 2001 From: polo Date: Sun, 18 Oct 2026 00:08:23 +0200 Subject: =?UTF-8?q?sortie=20de=20vendor=20du=20d=C3=A9p=C3=B4t,=20oubli=20?= =?UTF-8?q?dans=20config-template.ini?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orm/src/Mapping/Driver/AttributeDriver.php | 768 ----------------- .../orm/src/Mapping/Driver/AttributeReader.php | 146 ---- .../orm/src/Mapping/Driver/DatabaseDriver.php | 528 ------------ .../src/Mapping/Driver/ReflectionBasedDriver.php | 44 - .../Driver/RepeatableAttributeCollection.php | 16 - .../orm/src/Mapping/Driver/SimplifiedXmlDriver.php | 25 - .../doctrine/orm/src/Mapping/Driver/XmlDriver.php | 940 --------------------- 7 files changed, 2467 deletions(-) delete mode 100644 vendor/doctrine/orm/src/Mapping/Driver/AttributeDriver.php delete mode 100644 vendor/doctrine/orm/src/Mapping/Driver/AttributeReader.php delete mode 100644 vendor/doctrine/orm/src/Mapping/Driver/DatabaseDriver.php delete mode 100644 vendor/doctrine/orm/src/Mapping/Driver/ReflectionBasedDriver.php delete mode 100644 vendor/doctrine/orm/src/Mapping/Driver/RepeatableAttributeCollection.php delete mode 100644 vendor/doctrine/orm/src/Mapping/Driver/SimplifiedXmlDriver.php delete mode 100644 vendor/doctrine/orm/src/Mapping/Driver/XmlDriver.php (limited to 'vendor/doctrine/orm/src/Mapping/Driver') diff --git a/vendor/doctrine/orm/src/Mapping/Driver/AttributeDriver.php b/vendor/doctrine/orm/src/Mapping/Driver/AttributeDriver.php deleted file mode 100644 index 6fed1a2..0000000 --- a/vendor/doctrine/orm/src/Mapping/Driver/AttributeDriver.php +++ /dev/null @@ -1,768 +0,0 @@ - 1, - Mapping\MappedSuperclass::class => 2, - ]; - - private readonly AttributeReader $reader; - - /** - * @param array $paths - * @param true $reportFieldsWhereDeclared no-op, to be removed in 4.0 - */ - public function __construct(array $paths, bool $reportFieldsWhereDeclared = true) - { - if (! $reportFieldsWhereDeclared) { - throw new InvalidArgumentException(sprintf( - 'The $reportFieldsWhereDeclared argument is no longer supported, make sure to omit it when calling %s.', - __METHOD__, - )); - } - - $this->reader = new AttributeReader(); - $this->addPaths($paths); - } - - public function isTransient(string $className): bool - { - $classAttributes = $this->reader->getClassAttributes(new ReflectionClass($className)); - - foreach ($classAttributes as $a) { - $attr = $a instanceof RepeatableAttributeCollection ? $a[0] : $a; - if (isset(self::ENTITY_ATTRIBUTE_CLASSES[$attr::class])) { - return false; - } - } - - return true; - } - - /** - * {@inheritDoc} - * - * @psalm-param class-string $className - * @psalm-param ClassMetadata $metadata - * - * @template T of object - */ - public function loadMetadataForClass(string $className, PersistenceClassMetadata $metadata): void - { - $reflectionClass = $metadata->getReflectionClass() - // this happens when running attribute driver in combination with - // static reflection services. This is not the nicest fix - ?? new ReflectionClass($metadata->name); - - $classAttributes = $this->reader->getClassAttributes($reflectionClass); - - // Evaluate Entity attribute - if (isset($classAttributes[Mapping\Entity::class])) { - $entityAttribute = $classAttributes[Mapping\Entity::class]; - if ($entityAttribute->repositoryClass !== null) { - $metadata->setCustomRepositoryClass($entityAttribute->repositoryClass); - } - - if ($entityAttribute->readOnly) { - $metadata->markReadOnly(); - } - } elseif (isset($classAttributes[Mapping\MappedSuperclass::class])) { - $mappedSuperclassAttribute = $classAttributes[Mapping\MappedSuperclass::class]; - - $metadata->setCustomRepositoryClass($mappedSuperclassAttribute->repositoryClass); - $metadata->isMappedSuperclass = true; - } elseif (isset($classAttributes[Mapping\Embeddable::class])) { - $metadata->isEmbeddedClass = true; - } else { - throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className); - } - - $primaryTable = []; - - if (isset($classAttributes[Mapping\Table::class])) { - $tableAnnot = $classAttributes[Mapping\Table::class]; - $primaryTable['name'] = $tableAnnot->name; - $primaryTable['schema'] = $tableAnnot->schema; - - if ($tableAnnot->options) { - $primaryTable['options'] = $tableAnnot->options; - } - } - - if (isset($classAttributes[Mapping\Index::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\Index::class); - } - - foreach ($classAttributes[Mapping\Index::class] as $idx => $indexAnnot) { - $index = []; - - if (! empty($indexAnnot->columns)) { - $index['columns'] = $indexAnnot->columns; - } - - if (! empty($indexAnnot->fields)) { - $index['fields'] = $indexAnnot->fields; - } - - if ( - isset($index['columns'], $index['fields']) - || ( - ! isset($index['columns']) - && ! isset($index['fields']) - ) - ) { - throw MappingException::invalidIndexConfiguration( - $className, - (string) ($indexAnnot->name ?? $idx), - ); - } - - if (! empty($indexAnnot->flags)) { - $index['flags'] = $indexAnnot->flags; - } - - if (! empty($indexAnnot->options)) { - $index['options'] = $indexAnnot->options; - } - - if (! empty($indexAnnot->name)) { - $primaryTable['indexes'][$indexAnnot->name] = $index; - } else { - $primaryTable['indexes'][] = $index; - } - } - } - - if (isset($classAttributes[Mapping\UniqueConstraint::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\UniqueConstraint::class); - } - - foreach ($classAttributes[Mapping\UniqueConstraint::class] as $idx => $uniqueConstraintAnnot) { - $uniqueConstraint = []; - - if (! empty($uniqueConstraintAnnot->columns)) { - $uniqueConstraint['columns'] = $uniqueConstraintAnnot->columns; - } - - if (! empty($uniqueConstraintAnnot->fields)) { - $uniqueConstraint['fields'] = $uniqueConstraintAnnot->fields; - } - - if ( - isset($uniqueConstraint['columns'], $uniqueConstraint['fields']) - || ( - ! isset($uniqueConstraint['columns']) - && ! isset($uniqueConstraint['fields']) - ) - ) { - throw MappingException::invalidUniqueConstraintConfiguration( - $className, - (string) ($uniqueConstraintAnnot->name ?? $idx), - ); - } - - if (! empty($uniqueConstraintAnnot->options)) { - $uniqueConstraint['options'] = $uniqueConstraintAnnot->options; - } - - if (! empty($uniqueConstraintAnnot->name)) { - $primaryTable['uniqueConstraints'][$uniqueConstraintAnnot->name] = $uniqueConstraint; - } else { - $primaryTable['uniqueConstraints'][] = $uniqueConstraint; - } - } - } - - $metadata->setPrimaryTable($primaryTable); - - // Evaluate #[Cache] attribute - if (isset($classAttributes[Mapping\Cache::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\Cache::class); - } - - $cacheAttribute = $classAttributes[Mapping\Cache::class]; - $cacheMap = [ - 'region' => $cacheAttribute->region, - 'usage' => constant('Doctrine\ORM\Mapping\ClassMetadata::CACHE_USAGE_' . $cacheAttribute->usage), - ]; - - $metadata->enableCache($cacheMap); - } - - // Evaluate InheritanceType attribute - if (isset($classAttributes[Mapping\InheritanceType::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\InheritanceType::class); - } - - $inheritanceTypeAttribute = $classAttributes[Mapping\InheritanceType::class]; - - $metadata->setInheritanceType( - constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . $inheritanceTypeAttribute->value), - ); - - if ($metadata->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) { - // Evaluate DiscriminatorColumn attribute - if (isset($classAttributes[Mapping\DiscriminatorColumn::class])) { - $discrColumnAttribute = $classAttributes[Mapping\DiscriminatorColumn::class]; - assert($discrColumnAttribute instanceof Mapping\DiscriminatorColumn); - - $columnDef = [ - 'name' => $discrColumnAttribute->name, - 'type' => $discrColumnAttribute->type ?? 'string', - 'length' => $discrColumnAttribute->length ?? 255, - 'columnDefinition' => $discrColumnAttribute->columnDefinition, - 'enumType' => $discrColumnAttribute->enumType, - ]; - - if ($discrColumnAttribute->options) { - $columnDef['options'] = $discrColumnAttribute->options; - } - - $metadata->setDiscriminatorColumn($columnDef); - } else { - $metadata->setDiscriminatorColumn(['name' => 'dtype', 'type' => 'string', 'length' => 255]); - } - - // Evaluate DiscriminatorMap attribute - if (isset($classAttributes[Mapping\DiscriminatorMap::class])) { - $discrMapAttribute = $classAttributes[Mapping\DiscriminatorMap::class]; - $metadata->setDiscriminatorMap($discrMapAttribute->value); - } - } - } - - // Evaluate DoctrineChangeTrackingPolicy attribute - if (isset($classAttributes[Mapping\ChangeTrackingPolicy::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\ChangeTrackingPolicy::class); - } - - $changeTrackingAttribute = $classAttributes[Mapping\ChangeTrackingPolicy::class]; - $metadata->setChangeTrackingPolicy(constant('Doctrine\ORM\Mapping\ClassMetadata::CHANGETRACKING_' . $changeTrackingAttribute->value)); - } - - foreach ($reflectionClass->getProperties() as $property) { - assert($property instanceof ReflectionProperty); - - if ($this->isRepeatedPropertyDeclaration($property, $metadata)) { - continue; - } - - $mapping = []; - $mapping['fieldName'] = $property->name; - - // Evaluate #[Cache] attribute - $cacheAttribute = $this->reader->getPropertyAttribute($property, Mapping\Cache::class); - if ($cacheAttribute !== null) { - assert($cacheAttribute instanceof Mapping\Cache); - - $mapping['cache'] = $metadata->getAssociationCacheDefaults( - $mapping['fieldName'], - [ - 'usage' => (int) constant('Doctrine\ORM\Mapping\ClassMetadata::CACHE_USAGE_' . $cacheAttribute->usage), - 'region' => $cacheAttribute->region, - ], - ); - } - - // Check for JoinColumn/JoinColumns attributes - $joinColumns = []; - - $joinColumnAttributes = $this->reader->getPropertyAttributeCollection($property, Mapping\JoinColumn::class); - - foreach ($joinColumnAttributes as $joinColumnAttribute) { - $joinColumns[] = $this->joinColumnToArray($joinColumnAttribute); - } - - // Field can only be attributed with one of: - // Column, OneToOne, OneToMany, ManyToOne, ManyToMany, Embedded - $columnAttribute = $this->reader->getPropertyAttribute($property, Mapping\Column::class); - $oneToOneAttribute = $this->reader->getPropertyAttribute($property, Mapping\OneToOne::class); - $oneToManyAttribute = $this->reader->getPropertyAttribute($property, Mapping\OneToMany::class); - $manyToOneAttribute = $this->reader->getPropertyAttribute($property, Mapping\ManyToOne::class); - $manyToManyAttribute = $this->reader->getPropertyAttribute($property, Mapping\ManyToMany::class); - $embeddedAttribute = $this->reader->getPropertyAttribute($property, Mapping\Embedded::class); - - if ($columnAttribute !== null) { - $mapping = $this->columnToArray($property->name, $columnAttribute); - - if ($this->reader->getPropertyAttribute($property, Mapping\Id::class)) { - $mapping['id'] = true; - } - - $generatedValueAttribute = $this->reader->getPropertyAttribute($property, Mapping\GeneratedValue::class); - - if ($generatedValueAttribute !== null) { - $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' . $generatedValueAttribute->strategy)); - } - - if ($this->reader->getPropertyAttribute($property, Mapping\Version::class)) { - $metadata->setVersionMapping($mapping); - } - - $metadata->mapField($mapping); - - // Check for SequenceGenerator/TableGenerator definition - $seqGeneratorAttribute = $this->reader->getPropertyAttribute($property, Mapping\SequenceGenerator::class); - $customGeneratorAttribute = $this->reader->getPropertyAttribute($property, Mapping\CustomIdGenerator::class); - - if ($seqGeneratorAttribute !== null) { - $metadata->setSequenceGeneratorDefinition( - [ - 'sequenceName' => $seqGeneratorAttribute->sequenceName, - 'allocationSize' => $seqGeneratorAttribute->allocationSize, - 'initialValue' => $seqGeneratorAttribute->initialValue, - ], - ); - } elseif ($customGeneratorAttribute !== null) { - $metadata->setCustomGeneratorDefinition( - [ - 'class' => $customGeneratorAttribute->class, - ], - ); - } - } elseif ($oneToOneAttribute !== null) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\OneToOne::class); - } - - if ($this->reader->getPropertyAttribute($property, Mapping\Id::class)) { - $mapping['id'] = true; - } - - $mapping['targetEntity'] = $oneToOneAttribute->targetEntity; - $mapping['joinColumns'] = $joinColumns; - $mapping['mappedBy'] = $oneToOneAttribute->mappedBy; - $mapping['inversedBy'] = $oneToOneAttribute->inversedBy; - $mapping['cascade'] = $oneToOneAttribute->cascade; - $mapping['orphanRemoval'] = $oneToOneAttribute->orphanRemoval; - $mapping['fetch'] = $this->getFetchMode($className, $oneToOneAttribute->fetch); - $metadata->mapOneToOne($mapping); - } elseif ($oneToManyAttribute !== null) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\OneToMany::class); - } - - $mapping['mappedBy'] = $oneToManyAttribute->mappedBy; - $mapping['targetEntity'] = $oneToManyAttribute->targetEntity; - $mapping['cascade'] = $oneToManyAttribute->cascade; - $mapping['indexBy'] = $oneToManyAttribute->indexBy; - $mapping['orphanRemoval'] = $oneToManyAttribute->orphanRemoval; - $mapping['fetch'] = $this->getFetchMode($className, $oneToManyAttribute->fetch); - - $orderByAttribute = $this->reader->getPropertyAttribute($property, Mapping\OrderBy::class); - - if ($orderByAttribute !== null) { - $mapping['orderBy'] = $orderByAttribute->value; - } - - $metadata->mapOneToMany($mapping); - } elseif ($manyToOneAttribute !== null) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\OneToMany::class); - } - - $idAttribute = $this->reader->getPropertyAttribute($property, Mapping\Id::class); - - if ($idAttribute !== null) { - $mapping['id'] = true; - } - - $mapping['joinColumns'] = $joinColumns; - $mapping['cascade'] = $manyToOneAttribute->cascade; - $mapping['inversedBy'] = $manyToOneAttribute->inversedBy; - $mapping['targetEntity'] = $manyToOneAttribute->targetEntity; - $mapping['fetch'] = $this->getFetchMode($className, $manyToOneAttribute->fetch); - $metadata->mapManyToOne($mapping); - } elseif ($manyToManyAttribute !== null) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\ManyToMany::class); - } - - $joinTable = []; - $joinTableAttribute = $this->reader->getPropertyAttribute($property, Mapping\JoinTable::class); - - if ($joinTableAttribute !== null) { - $joinTable = [ - 'name' => $joinTableAttribute->name, - 'schema' => $joinTableAttribute->schema, - ]; - - if ($joinTableAttribute->options) { - $joinTable['options'] = $joinTableAttribute->options; - } - - foreach ($joinTableAttribute->joinColumns as $joinColumn) { - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumn); - } - - foreach ($joinTableAttribute->inverseJoinColumns as $joinColumn) { - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumn); - } - } - - foreach ($this->reader->getPropertyAttributeCollection($property, Mapping\JoinColumn::class) as $joinColumn) { - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumn); - } - - foreach ($this->reader->getPropertyAttributeCollection($property, Mapping\InverseJoinColumn::class) as $joinColumn) { - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumn); - } - - $mapping['joinTable'] = $joinTable; - $mapping['targetEntity'] = $manyToManyAttribute->targetEntity; - $mapping['mappedBy'] = $manyToManyAttribute->mappedBy; - $mapping['inversedBy'] = $manyToManyAttribute->inversedBy; - $mapping['cascade'] = $manyToManyAttribute->cascade; - $mapping['indexBy'] = $manyToManyAttribute->indexBy; - $mapping['orphanRemoval'] = $manyToManyAttribute->orphanRemoval; - $mapping['fetch'] = $this->getFetchMode($className, $manyToManyAttribute->fetch); - - $orderByAttribute = $this->reader->getPropertyAttribute($property, Mapping\OrderBy::class); - - if ($orderByAttribute !== null) { - $mapping['orderBy'] = $orderByAttribute->value; - } - - $metadata->mapManyToMany($mapping); - } elseif ($embeddedAttribute !== null) { - $mapping['class'] = $embeddedAttribute->class; - $mapping['columnPrefix'] = $embeddedAttribute->columnPrefix; - - $metadata->mapEmbedded($mapping); - } - } - - // Evaluate AssociationOverrides attribute - if (isset($classAttributes[Mapping\AssociationOverrides::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\AssociationOverride::class); - } - - $associationOverride = $classAttributes[Mapping\AssociationOverrides::class]; - - foreach ($associationOverride->overrides as $associationOverride) { - $override = []; - $fieldName = $associationOverride->name; - - // Check for JoinColumn/JoinColumns attributes - if ($associationOverride->joinColumns) { - $joinColumns = []; - - foreach ($associationOverride->joinColumns as $joinColumn) { - $joinColumns[] = $this->joinColumnToArray($joinColumn); - } - - $override['joinColumns'] = $joinColumns; - } - - if ($associationOverride->inverseJoinColumns) { - $joinColumns = []; - - foreach ($associationOverride->inverseJoinColumns as $joinColumn) { - $joinColumns[] = $this->joinColumnToArray($joinColumn); - } - - $override['inverseJoinColumns'] = $joinColumns; - } - - // Check for JoinTable attributes - if ($associationOverride->joinTable) { - $joinTableAnnot = $associationOverride->joinTable; - $joinTable = [ - 'name' => $joinTableAnnot->name, - 'schema' => $joinTableAnnot->schema, - 'joinColumns' => $override['joinColumns'] ?? [], - 'inverseJoinColumns' => $override['inverseJoinColumns'] ?? [], - ]; - - unset($override['joinColumns'], $override['inverseJoinColumns']); - - $override['joinTable'] = $joinTable; - } - - // Check for inversedBy - if ($associationOverride->inversedBy) { - $override['inversedBy'] = $associationOverride->inversedBy; - } - - // Check for `fetch` - if ($associationOverride->fetch) { - $override['fetch'] = constant(ClassMetadata::class . '::FETCH_' . $associationOverride->fetch); - } - - $metadata->setAssociationOverride($fieldName, $override); - } - } - - // Evaluate AttributeOverrides attribute - if (isset($classAttributes[Mapping\AttributeOverrides::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\AttributeOverrides::class); - } - - $attributeOverridesAnnot = $classAttributes[Mapping\AttributeOverrides::class]; - - foreach ($attributeOverridesAnnot->overrides as $attributeOverride) { - $mapping = $this->columnToArray($attributeOverride->name, $attributeOverride->column); - - $metadata->setAttributeOverride($attributeOverride->name, $mapping); - } - } - - // Evaluate EntityListeners attribute - if (isset($classAttributes[Mapping\EntityListeners::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\EntityListeners::class); - } - - $entityListenersAttribute = $classAttributes[Mapping\EntityListeners::class]; - - foreach ($entityListenersAttribute->value as $item) { - $listenerClassName = $metadata->fullyQualifiedClassName($item); - - if (! class_exists($listenerClassName)) { - throw MappingException::entityListenerClassNotFound($listenerClassName, $className); - } - - $hasMapping = false; - $listenerClass = new ReflectionClass($listenerClassName); - - foreach ($listenerClass->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { - assert($method instanceof ReflectionMethod); - // find method callbacks. - $callbacks = $this->getMethodCallbacks($method); - $hasMapping = $hasMapping ?: ! empty($callbacks); - - foreach ($callbacks as $value) { - $metadata->addEntityListener($value[1], $listenerClassName, $value[0]); - } - } - - // Evaluate the listener using naming convention. - if (! $hasMapping) { - EntityListenerBuilder::bindEntityListener($metadata, $listenerClassName); - } - } - } - - // Evaluate #[HasLifecycleCallbacks] attribute - if (isset($classAttributes[Mapping\HasLifecycleCallbacks::class])) { - if ($metadata->isEmbeddedClass) { - throw MappingException::invalidAttributeOnEmbeddable($metadata->name, Mapping\HasLifecycleCallbacks::class); - } - - foreach ($reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { - assert($method instanceof ReflectionMethod); - foreach ($this->getMethodCallbacks($method) as $value) { - $metadata->addLifecycleCallback($value[0], $value[1]); - } - } - } - } - - /** - * Attempts to resolve the fetch mode. - * - * @param class-string $className The class name. - * @param string $fetchMode The fetch mode. - * - * @return ClassMetadata::FETCH_* The fetch mode as defined in ClassMetadata. - * - * @throws MappingException If the fetch mode is not valid. - */ - private function getFetchMode(string $className, string $fetchMode): int - { - if (! defined('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $fetchMode)) { - throw MappingException::invalidFetchMode($className, $fetchMode); - } - - return constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . $fetchMode); - } - - /** - * Attempts to resolve the generated mode. - * - * @throws MappingException If the fetch mode is not valid. - */ - private function getGeneratedMode(string $generatedMode): int - { - if (! defined('Doctrine\ORM\Mapping\ClassMetadata::GENERATED_' . $generatedMode)) { - throw MappingException::invalidGeneratedMode($generatedMode); - } - - return constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATED_' . $generatedMode); - } - - /** - * Parses the given method. - * - * @return list - * @psalm-return list - */ - private function getMethodCallbacks(ReflectionMethod $method): array - { - $callbacks = []; - $attributes = $this->reader->getMethodAttributes($method); - - foreach ($attributes as $attribute) { - if ($attribute instanceof Mapping\PrePersist) { - $callbacks[] = [$method->name, Events::prePersist]; - } - - if ($attribute instanceof Mapping\PostPersist) { - $callbacks[] = [$method->name, Events::postPersist]; - } - - if ($attribute instanceof Mapping\PreUpdate) { - $callbacks[] = [$method->name, Events::preUpdate]; - } - - if ($attribute instanceof Mapping\PostUpdate) { - $callbacks[] = [$method->name, Events::postUpdate]; - } - - if ($attribute instanceof Mapping\PreRemove) { - $callbacks[] = [$method->name, Events::preRemove]; - } - - if ($attribute instanceof Mapping\PostRemove) { - $callbacks[] = [$method->name, Events::postRemove]; - } - - if ($attribute instanceof Mapping\PostLoad) { - $callbacks[] = [$method->name, Events::postLoad]; - } - - if ($attribute instanceof Mapping\PreFlush) { - $callbacks[] = [$method->name, Events::preFlush]; - } - } - - return $callbacks; - } - - /** - * Parse the given JoinColumn as array - * - * @return mixed[] - * @psalm-return array{ - * name: string|null, - * unique: bool, - * nullable: bool, - * onDelete: mixed, - * columnDefinition: string|null, - * referencedColumnName: string, - * options?: array - * } - */ - private function joinColumnToArray(Mapping\JoinColumn|Mapping\InverseJoinColumn $joinColumn): array - { - $mapping = [ - 'name' => $joinColumn->name, - 'unique' => $joinColumn->unique, - 'nullable' => $joinColumn->nullable, - 'onDelete' => $joinColumn->onDelete, - 'columnDefinition' => $joinColumn->columnDefinition, - 'referencedColumnName' => $joinColumn->referencedColumnName, - ]; - - if ($joinColumn->options) { - $mapping['options'] = $joinColumn->options; - } - - return $mapping; - } - - /** - * Parse the given Column as array - * - * @return mixed[] - * @psalm-return array{ - * fieldName: string, - * type: mixed, - * scale: int, - * length: int, - * unique: bool, - * nullable: bool, - * precision: int, - * enumType?: class-string, - * options?: mixed[], - * columnName?: string, - * columnDefinition?: string - * } - */ - private function columnToArray(string $fieldName, Mapping\Column $column): array - { - $mapping = [ - 'fieldName' => $fieldName, - 'type' => $column->type, - 'scale' => $column->scale, - 'length' => $column->length, - 'unique' => $column->unique, - 'nullable' => $column->nullable, - 'precision' => $column->precision, - ]; - - if ($column->options) { - $mapping['options'] = $column->options; - } - - if (isset($column->name)) { - $mapping['columnName'] = $column->name; - } - - if (isset($column->columnDefinition)) { - $mapping['columnDefinition'] = $column->columnDefinition; - } - - if ($column->updatable === false) { - $mapping['notUpdatable'] = true; - } - - if ($column->insertable === false) { - $mapping['notInsertable'] = true; - } - - if ($column->generated !== null) { - $mapping['generated'] = $this->getGeneratedMode($column->generated); - } - - if ($column->enumType) { - $mapping['enumType'] = $column->enumType; - } - - return $mapping; - } -} diff --git a/vendor/doctrine/orm/src/Mapping/Driver/AttributeReader.php b/vendor/doctrine/orm/src/Mapping/Driver/AttributeReader.php deleted file mode 100644 index 2de622a..0000000 --- a/vendor/doctrine/orm/src/Mapping/Driver/AttributeReader.php +++ /dev/null @@ -1,146 +0,0 @@ -, bool> */ - private array $isRepeatableAttribute = []; - - /** - * @psalm-return class-string-map> - * - * @template T of MappingAttribute - */ - public function getClassAttributes(ReflectionClass $class): array - { - return $this->convertToAttributeInstances($class->getAttributes()); - } - - /** - * @return class-string-map> - * - * @template T of MappingAttribute - */ - public function getMethodAttributes(ReflectionMethod $method): array - { - return $this->convertToAttributeInstances($method->getAttributes()); - } - - /** - * @return class-string-map> - * - * @template T of MappingAttribute - */ - public function getPropertyAttributes(ReflectionProperty $property): array - { - return $this->convertToAttributeInstances($property->getAttributes()); - } - - /** - * @param class-string $attributeName The name of the annotation. - * - * @return T|null - * - * @template T of MappingAttribute - */ - public function getPropertyAttribute(ReflectionProperty $property, string $attributeName) - { - if ($this->isRepeatable($attributeName)) { - throw new LogicException(sprintf( - 'The attribute "%s" is repeatable. Call getPropertyAttributeCollection() instead.', - $attributeName, - )); - } - - return $this->getPropertyAttributes($property)[$attributeName] ?? null; - } - - /** - * @param class-string $attributeName The name of the annotation. - * - * @return RepeatableAttributeCollection - * - * @template T of MappingAttribute - */ - public function getPropertyAttributeCollection( - ReflectionProperty $property, - string $attributeName, - ): RepeatableAttributeCollection { - if (! $this->isRepeatable($attributeName)) { - throw new LogicException(sprintf( - 'The attribute "%s" is not repeatable. Call getPropertyAttribute() instead.', - $attributeName, - )); - } - - return $this->getPropertyAttributes($property)[$attributeName] ?? new RepeatableAttributeCollection(); - } - - /** - * @param array $attributes - * - * @return class-string-map> - * - * @template T of MappingAttribute - */ - private function convertToAttributeInstances(array $attributes): array - { - $instances = []; - - foreach ($attributes as $attribute) { - $attributeName = $attribute->getName(); - assert(is_string($attributeName)); - // Make sure we only get Doctrine Attributes - if (! is_subclass_of($attributeName, MappingAttribute::class)) { - continue; - } - - $instance = $attribute->newInstance(); - assert($instance instanceof MappingAttribute); - - if ($this->isRepeatable($attributeName)) { - if (! isset($instances[$attributeName])) { - $instances[$attributeName] = new RepeatableAttributeCollection(); - } - - $collection = $instances[$attributeName]; - assert($collection instanceof RepeatableAttributeCollection); - $collection[] = $instance; - } else { - $instances[$attributeName] = $instance; - } - } - - return $instances; - } - - /** @param class-string $attributeClassName */ - private function isRepeatable(string $attributeClassName): bool - { - if (isset($this->isRepeatableAttribute[$attributeClassName])) { - return $this->isRepeatableAttribute[$attributeClassName]; - } - - $reflectionClass = new ReflectionClass($attributeClassName); - $attribute = $reflectionClass->getAttributes()[0]->newInstance(); - - return $this->isRepeatableAttribute[$attributeClassName] = ($attribute->flags & Attribute::IS_REPEATABLE) > 0; - } -} diff --git a/vendor/doctrine/orm/src/Mapping/Driver/DatabaseDriver.php b/vendor/doctrine/orm/src/Mapping/Driver/DatabaseDriver.php deleted file mode 100644 index 49e2e93..0000000 --- a/vendor/doctrine/orm/src/Mapping/Driver/DatabaseDriver.php +++ /dev/null @@ -1,528 +0,0 @@ -|null */ - private array|null $tables = null; - - /** @var array */ - private array $classToTableNames = []; - - /** @psalm-var array */ - private array $manyToManyTables = []; - - /** @var mixed[] */ - private array $classNamesForTables = []; - - /** @var mixed[] */ - private array $fieldNamesForColumns = []; - - /** - * The namespace for the generated entities. - */ - private string|null $namespace = null; - - private Inflector $inflector; - - public function __construct(private readonly AbstractSchemaManager $sm) - { - $this->inflector = InflectorFactory::create()->build(); - } - - /** - * Set the namespace for the generated entities. - */ - public function setNamespace(string $namespace): void - { - $this->namespace = $namespace; - } - - public function isTransient(string $className): bool - { - return true; - } - - /** - * {@inheritDoc} - */ - public function getAllClassNames(): array - { - $this->reverseEngineerMappingFromDatabase(); - - return array_keys($this->classToTableNames); - } - - /** - * Sets class name for a table. - */ - public function setClassNameForTable(string $tableName, string $className): void - { - $this->classNamesForTables[$tableName] = $className; - } - - /** - * Sets field name for a column on a specific table. - */ - public function setFieldNameForColumn(string $tableName, string $columnName, string $fieldName): void - { - $this->fieldNamesForColumns[$tableName][$columnName] = $fieldName; - } - - /** - * Sets tables manually instead of relying on the reverse engineering capabilities of SchemaManager. - * - * @param Table[] $entityTables - * @param Table[] $manyToManyTables - * @psalm-param list $entityTables - * @psalm-param list
$manyToManyTables - */ - public function setTables(array $entityTables, array $manyToManyTables): void - { - $this->tables = $this->manyToManyTables = $this->classToTableNames = []; - - foreach ($entityTables as $table) { - $className = $this->getClassNameForTable($table->getName()); - - $this->classToTableNames[$className] = $table->getName(); - $this->tables[$table->getName()] = $table; - } - - foreach ($manyToManyTables as $table) { - $this->manyToManyTables[$table->getName()] = $table; - } - } - - public function setInflector(Inflector $inflector): void - { - $this->inflector = $inflector; - } - - /** - * {@inheritDoc} - * - * @psalm-param class-string $className - * @psalm-param ClassMetadata $metadata - * - * @template T of object - */ - public function loadMetadataForClass(string $className, PersistenceClassMetadata $metadata): void - { - if (! $metadata instanceof ClassMetadata) { - throw new TypeError(sprintf( - 'Argument #2 passed to %s() must be an instance of %s, %s given.', - __METHOD__, - ClassMetadata::class, - get_debug_type($metadata), - )); - } - - $this->reverseEngineerMappingFromDatabase(); - - if (! isset($this->classToTableNames[$className])) { - throw new InvalidArgumentException('Unknown class ' . $className); - } - - $tableName = $this->classToTableNames[$className]; - - $metadata->name = $className; - $metadata->table['name'] = $tableName; - - $this->buildIndexes($metadata); - $this->buildFieldMappings($metadata); - $this->buildToOneAssociationMappings($metadata); - - foreach ($this->manyToManyTables as $manyTable) { - foreach ($manyTable->getForeignKeys() as $foreignKey) { - // foreign key maps to the table of the current entity, many to many association probably exists - if (! (strtolower($tableName) === strtolower($foreignKey->getForeignTableName()))) { - continue; - } - - $myFk = $foreignKey; - $otherFk = null; - - foreach ($manyTable->getForeignKeys() as $foreignKey) { - if ($foreignKey !== $myFk) { - $otherFk = $foreignKey; - break; - } - } - - if (! $otherFk) { - // the definition of this many to many table does not contain - // enough foreign key information to continue reverse engineering. - continue; - } - - $localColumn = current($myFk->getLocalColumns()); - - $associationMapping = []; - $associationMapping['fieldName'] = $this->getFieldNameForColumn($manyTable->getName(), current($otherFk->getLocalColumns()), true); - $associationMapping['targetEntity'] = $this->getClassNameForTable($otherFk->getForeignTableName()); - - if (current($manyTable->getColumns())->getName() === $localColumn) { - $associationMapping['inversedBy'] = $this->getFieldNameForColumn($manyTable->getName(), current($myFk->getLocalColumns()), true); - $associationMapping['joinTable'] = [ - 'name' => strtolower($manyTable->getName()), - 'joinColumns' => [], - 'inverseJoinColumns' => [], - ]; - - $fkCols = $myFk->getForeignColumns(); - $cols = $myFk->getLocalColumns(); - - for ($i = 0, $colsCount = count($cols); $i < $colsCount; $i++) { - $associationMapping['joinTable']['joinColumns'][] = [ - 'name' => $cols[$i], - 'referencedColumnName' => $fkCols[$i], - ]; - } - - $fkCols = $otherFk->getForeignColumns(); - $cols = $otherFk->getLocalColumns(); - - for ($i = 0, $colsCount = count($cols); $i < $colsCount; $i++) { - $associationMapping['joinTable']['inverseJoinColumns'][] = [ - 'name' => $cols[$i], - 'referencedColumnName' => $fkCols[$i], - ]; - } - } else { - $associationMapping['mappedBy'] = $this->getFieldNameForColumn($manyTable->getName(), current($myFk->getLocalColumns()), true); - } - - $metadata->mapManyToMany($associationMapping); - - break; - } - } - } - - /** @throws MappingException */ - private function reverseEngineerMappingFromDatabase(): void - { - if ($this->tables !== null) { - return; - } - - $this->tables = $this->manyToManyTables = $this->classToTableNames = []; - - foreach ($this->sm->listTables() as $table) { - $tableName = $table->getName(); - $foreignKeys = $table->getForeignKeys(); - - $allForeignKeyColumns = []; - - foreach ($foreignKeys as $foreignKey) { - $allForeignKeyColumns = array_merge($allForeignKeyColumns, $foreignKey->getLocalColumns()); - } - - $primaryKey = $table->getPrimaryKey(); - if ($primaryKey === null) { - throw new MappingException( - 'Table ' . $tableName . ' has no primary key. Doctrine does not ' . - "support reverse engineering from tables that don't have a primary key.", - ); - } - - $pkColumns = $primaryKey->getColumns(); - - sort($pkColumns); - sort($allForeignKeyColumns); - - if ($pkColumns === $allForeignKeyColumns && count($foreignKeys) === 2) { - $this->manyToManyTables[$tableName] = $table; - } else { - // lower-casing is necessary because of Oracle Uppercase Tablenames, - // assumption is lower-case + underscore separated. - $className = $this->getClassNameForTable($tableName); - - $this->tables[$tableName] = $table; - $this->classToTableNames[$className] = $tableName; - } - } - } - - /** - * Build indexes from a class metadata. - */ - private function buildIndexes(ClassMetadata $metadata): void - { - $tableName = $metadata->table['name']; - $indexes = $this->tables[$tableName]->getIndexes(); - - foreach ($indexes as $index) { - if ($index->isPrimary()) { - continue; - } - - $indexName = $index->getName(); - $indexColumns = $index->getColumns(); - $constraintType = $index->isUnique() - ? 'uniqueConstraints' - : 'indexes'; - - $metadata->table[$constraintType][$indexName]['columns'] = $indexColumns; - } - } - - /** - * Build field mapping from class metadata. - */ - private function buildFieldMappings(ClassMetadata $metadata): void - { - $tableName = $metadata->table['name']; - $columns = $this->tables[$tableName]->getColumns(); - $primaryKeys = $this->getTablePrimaryKeys($this->tables[$tableName]); - $foreignKeys = $this->tables[$tableName]->getForeignKeys(); - $allForeignKeys = []; - - foreach ($foreignKeys as $foreignKey) { - $allForeignKeys = array_merge($allForeignKeys, $foreignKey->getLocalColumns()); - } - - $ids = []; - $fieldMappings = []; - - foreach ($columns as $column) { - if (in_array($column->getName(), $allForeignKeys, true)) { - continue; - } - - $fieldMapping = $this->buildFieldMapping($tableName, $column); - - if ($primaryKeys && in_array($column->getName(), $primaryKeys, true)) { - $fieldMapping['id'] = true; - $ids[] = $fieldMapping; - } - - $fieldMappings[] = $fieldMapping; - } - - // We need to check for the columns here, because we might have associations as id as well. - if ($ids && count($primaryKeys) === 1) { - $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_AUTO); - } - - foreach ($fieldMappings as $fieldMapping) { - $metadata->mapField($fieldMapping); - } - } - - /** - * Build field mapping from a schema column definition - * - * @return mixed[] - * @psalm-return array{ - * fieldName: string, - * columnName: string, - * type: string, - * nullable: bool, - * options: array{ - * unsigned?: bool, - * fixed?: bool, - * comment: string|null, - * default?: mixed - * }, - * precision?: int, - * scale?: int, - * length?: int|null - * } - */ - private function buildFieldMapping(string $tableName, Column $column): array - { - $fieldMapping = [ - 'fieldName' => $this->getFieldNameForColumn($tableName, $column->getName(), false), - 'columnName' => $column->getName(), - 'type' => Type::getTypeRegistry()->lookupName($column->getType()), - 'nullable' => ! $column->getNotnull(), - 'options' => [ - 'comment' => $column->getComment(), - ], - ]; - - // Type specific elements - switch ($fieldMapping['type']) { - case self::ARRAY: - case Types::BLOB: - case Types::GUID: - case self::OBJECT: - case Types::SIMPLE_ARRAY: - case Types::STRING: - case Types::TEXT: - $fieldMapping['length'] = $column->getLength(); - $fieldMapping['options']['fixed'] = $column->getFixed(); - break; - - case Types::DECIMAL: - case Types::FLOAT: - $fieldMapping['precision'] = $column->getPrecision(); - $fieldMapping['scale'] = $column->getScale(); - break; - - case Types::INTEGER: - case Types::BIGINT: - case Types::SMALLINT: - $fieldMapping['options']['unsigned'] = $column->getUnsigned(); - break; - } - - // Default - $default = $column->getDefault(); - if ($default !== null) { - $fieldMapping['options']['default'] = $default; - } - - return $fieldMapping; - } - - /** - * Build to one (one to one, many to one) association mapping from class metadata. - */ - private function buildToOneAssociationMappings(ClassMetadata $metadata): void - { - assert($this->tables !== null); - - $tableName = $metadata->table['name']; - $primaryKeys = $this->getTablePrimaryKeys($this->tables[$tableName]); - $foreignKeys = $this->tables[$tableName]->getForeignKeys(); - - foreach ($foreignKeys as $foreignKey) { - $foreignTableName = $foreignKey->getForeignTableName(); - $fkColumns = $foreignKey->getLocalColumns(); - $fkForeignColumns = $foreignKey->getForeignColumns(); - $localColumn = current($fkColumns); - $associationMapping = [ - 'fieldName' => $this->getFieldNameForColumn($tableName, $localColumn, true), - 'targetEntity' => $this->getClassNameForTable($foreignTableName), - ]; - - if (isset($metadata->fieldMappings[$associationMapping['fieldName']])) { - $associationMapping['fieldName'] .= '2'; // "foo" => "foo2" - } - - if ($primaryKeys && in_array($localColumn, $primaryKeys, true)) { - $associationMapping['id'] = true; - } - - for ($i = 0, $fkColumnsCount = count($fkColumns); $i < $fkColumnsCount; $i++) { - $associationMapping['joinColumns'][] = [ - 'name' => $fkColumns[$i], - 'referencedColumnName' => $fkForeignColumns[$i], - ]; - } - - // Here we need to check if $fkColumns are the same as $primaryKeys - if (! array_diff($fkColumns, $primaryKeys)) { - $metadata->mapOneToOne($associationMapping); - } else { - $metadata->mapManyToOne($associationMapping); - } - } - } - - /** - * Retrieve schema table definition primary keys. - * - * @return string[] - */ - private function getTablePrimaryKeys(Table $table): array - { - try { - return $table->getPrimaryKey()->getColumns(); - } catch (SchemaException) { - // Do nothing - } - - return []; - } - - /** - * Returns the mapped class name for a table if it exists. Otherwise return "classified" version. - * - * @psalm-return class-string - */ - private function getClassNameForTable(string $tableName): string - { - if (isset($this->classNamesForTables[$tableName])) { - return $this->namespace . $this->classNamesForTables[$tableName]; - } - - return $this->namespace . $this->inflector->classify(strtolower($tableName)); - } - - /** - * Return the mapped field name for a column, if it exists. Otherwise return camelized version. - * - * @param bool $fk Whether the column is a foreignkey or not. - */ - private function getFieldNameForColumn( - string $tableName, - string $columnName, - bool $fk = false, - ): string { - if (isset($this->fieldNamesForColumns[$tableName], $this->fieldNamesForColumns[$tableName][$columnName])) { - return $this->fieldNamesForColumns[$tableName][$columnName]; - } - - $columnName = strtolower($columnName); - - // Replace _id if it is a foreignkey column - if ($fk) { - $columnName = preg_replace('/_id$/', '', $columnName); - } - - return $this->inflector->camelize($columnName); - } -} diff --git a/vendor/doctrine/orm/src/Mapping/Driver/ReflectionBasedDriver.php b/vendor/doctrine/orm/src/Mapping/Driver/ReflectionBasedDriver.php deleted file mode 100644 index 7d85471..0000000 --- a/vendor/doctrine/orm/src/Mapping/Driver/ReflectionBasedDriver.php +++ /dev/null @@ -1,44 +0,0 @@ -class; - - if ( - isset($metadata->fieldMappings[$property->name]->declared) - && $metadata->fieldMappings[$property->name]->declared === $declaringClass - ) { - return true; - } - - if ( - isset($metadata->associationMappings[$property->name]->declared) - && $metadata->associationMappings[$property->name]->declared === $declaringClass - ) { - return true; - } - - return isset($metadata->embeddedClasses[$property->name]->declared) - && $metadata->embeddedClasses[$property->name]->declared === $declaringClass; - } -} diff --git a/vendor/doctrine/orm/src/Mapping/Driver/RepeatableAttributeCollection.php b/vendor/doctrine/orm/src/Mapping/Driver/RepeatableAttributeCollection.php deleted file mode 100644 index 2f6ae93..0000000 --- a/vendor/doctrine/orm/src/Mapping/Driver/RepeatableAttributeCollection.php +++ /dev/null @@ -1,16 +0,0 @@ - - * @template T of MappingAttribute - */ -final class RepeatableAttributeCollection extends ArrayObject -{ -} diff --git a/vendor/doctrine/orm/src/Mapping/Driver/SimplifiedXmlDriver.php b/vendor/doctrine/orm/src/Mapping/Driver/SimplifiedXmlDriver.php deleted file mode 100644 index 486185f..0000000 --- a/vendor/doctrine/orm/src/Mapping/Driver/SimplifiedXmlDriver.php +++ /dev/null @@ -1,25 +0,0 @@ - - */ -class XmlDriver extends FileDriver -{ - public const DEFAULT_FILE_EXTENSION = '.dcm.xml'; - - /** - * {@inheritDoc} - */ - public function __construct( - string|array|FileLocator $locator, - string $fileExtension = self::DEFAULT_FILE_EXTENSION, - private readonly bool $isXsdValidationEnabled = true, - ) { - if (! extension_loaded('simplexml')) { - throw new LogicException( - 'The XML metadata driver cannot be enabled because the SimpleXML PHP extension is missing.' - . ' Please configure PHP with SimpleXML or choose a different metadata driver.', - ); - } - - if ($isXsdValidationEnabled && ! extension_loaded('dom')) { - throw new LogicException( - 'XSD validation cannot be enabled because the DOM extension is missing.', - ); - } - - parent::__construct($locator, $fileExtension); - } - - /** - * {@inheritDoc} - * - * @psalm-param class-string $className - * @psalm-param ClassMetadata $metadata - * - * @template T of object - */ - public function loadMetadataForClass($className, PersistenceClassMetadata $metadata): void - { - $xmlRoot = $this->getElement($className); - - if ($xmlRoot->getName() === 'entity') { - if (isset($xmlRoot['repository-class'])) { - $metadata->setCustomRepositoryClass((string) $xmlRoot['repository-class']); - } - - if (isset($xmlRoot['read-only']) && $this->evaluateBoolean($xmlRoot['read-only'])) { - $metadata->markReadOnly(); - } - } elseif ($xmlRoot->getName() === 'mapped-superclass') { - $metadata->setCustomRepositoryClass( - isset($xmlRoot['repository-class']) ? (string) $xmlRoot['repository-class'] : null, - ); - $metadata->isMappedSuperclass = true; - } elseif ($xmlRoot->getName() === 'embeddable') { - $metadata->isEmbeddedClass = true; - } else { - throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className); - } - - // Evaluate attributes - $primaryTable = []; - - if (isset($xmlRoot['table'])) { - $primaryTable['name'] = (string) $xmlRoot['table']; - } - - if (isset($xmlRoot['schema'])) { - $primaryTable['schema'] = (string) $xmlRoot['schema']; - } - - $metadata->setPrimaryTable($primaryTable); - - // Evaluate second level cache - if (isset($xmlRoot->cache)) { - $metadata->enableCache($this->cacheToArray($xmlRoot->cache)); - } - - if (isset($xmlRoot['inheritance-type'])) { - $inheritanceType = (string) $xmlRoot['inheritance-type']; - $metadata->setInheritanceType(constant('Doctrine\ORM\Mapping\ClassMetadata::INHERITANCE_TYPE_' . $inheritanceType)); - - if ($metadata->inheritanceType !== ClassMetadata::INHERITANCE_TYPE_NONE) { - // Evaluate - if (isset($xmlRoot->{'discriminator-column'})) { - $discrColumn = $xmlRoot->{'discriminator-column'}; - $columnDef = [ - 'name' => isset($discrColumn['name']) ? (string) $discrColumn['name'] : null, - 'type' => isset($discrColumn['type']) ? (string) $discrColumn['type'] : 'string', - 'length' => isset($discrColumn['length']) ? (int) $discrColumn['length'] : 255, - 'columnDefinition' => isset($discrColumn['column-definition']) ? (string) $discrColumn['column-definition'] : null, - 'enumType' => isset($discrColumn['enum-type']) ? (string) $discrColumn['enum-type'] : null, - ]; - - if (isset($discrColumn['options'])) { - assert($discrColumn['options'] instanceof SimpleXMLElement); - $columnDef['options'] = $this->parseOptions($discrColumn['options']->children()); - } - - $metadata->setDiscriminatorColumn($columnDef); - } else { - $metadata->setDiscriminatorColumn(['name' => 'dtype', 'type' => 'string', 'length' => 255]); - } - - // Evaluate - if (isset($xmlRoot->{'discriminator-map'})) { - $map = []; - assert($xmlRoot->{'discriminator-map'}->{'discriminator-mapping'} instanceof SimpleXMLElement); - foreach ($xmlRoot->{'discriminator-map'}->{'discriminator-mapping'} as $discrMapElement) { - $map[(string) $discrMapElement['value']] = (string) $discrMapElement['class']; - } - - $metadata->setDiscriminatorMap($map); - } - } - } - - // Evaluate - if (isset($xmlRoot['change-tracking-policy'])) { - $metadata->setChangeTrackingPolicy(constant('Doctrine\ORM\Mapping\ClassMetadata::CHANGETRACKING_' - . strtoupper((string) $xmlRoot['change-tracking-policy']))); - } - - // Evaluate - if (isset($xmlRoot->indexes)) { - $metadata->table['indexes'] = []; - foreach ($xmlRoot->indexes->index ?? [] as $indexXml) { - $index = []; - - if (isset($indexXml['columns']) && ! empty($indexXml['columns'])) { - $index['columns'] = explode(',', (string) $indexXml['columns']); - } - - if (isset($indexXml['fields'])) { - $index['fields'] = explode(',', (string) $indexXml['fields']); - } - - if ( - isset($index['columns'], $index['fields']) - || ( - ! isset($index['columns']) - && ! isset($index['fields']) - ) - ) { - throw MappingException::invalidIndexConfiguration( - $className, - (string) ($indexXml['name'] ?? count($metadata->table['indexes'])), - ); - } - - if (isset($indexXml['flags'])) { - $index['flags'] = explode(',', (string) $indexXml['flags']); - } - - if (isset($indexXml->options)) { - $index['options'] = $this->parseOptions($indexXml->options->children()); - } - - if (isset($indexXml['name'])) { - $metadata->table['indexes'][(string) $indexXml['name']] = $index; - } else { - $metadata->table['indexes'][] = $index; - } - } - } - - // Evaluate - if (isset($xmlRoot->{'unique-constraints'})) { - $metadata->table['uniqueConstraints'] = []; - foreach ($xmlRoot->{'unique-constraints'}->{'unique-constraint'} ?? [] as $uniqueXml) { - $unique = []; - - if (isset($uniqueXml['columns']) && ! empty($uniqueXml['columns'])) { - $unique['columns'] = explode(',', (string) $uniqueXml['columns']); - } - - if (isset($uniqueXml['fields'])) { - $unique['fields'] = explode(',', (string) $uniqueXml['fields']); - } - - if ( - isset($unique['columns'], $unique['fields']) - || ( - ! isset($unique['columns']) - && ! isset($unique['fields']) - ) - ) { - throw MappingException::invalidUniqueConstraintConfiguration( - $className, - (string) ($uniqueXml['name'] ?? count($metadata->table['uniqueConstraints'])), - ); - } - - if (isset($uniqueXml->options)) { - $unique['options'] = $this->parseOptions($uniqueXml->options->children()); - } - - if (isset($uniqueXml['name'])) { - $metadata->table['uniqueConstraints'][(string) $uniqueXml['name']] = $unique; - } else { - $metadata->table['uniqueConstraints'][] = $unique; - } - } - } - - if (isset($xmlRoot->options)) { - $metadata->table['options'] = $this->parseOptions($xmlRoot->options->children()); - } - - // The mapping assignment is done in 2 times as a bug might occurs on some php/xml lib versions - // The internal SimpleXmlIterator get resetted, to this generate a duplicate field exception - // Evaluate mappings - if (isset($xmlRoot->field)) { - foreach ($xmlRoot->field as $fieldMapping) { - $mapping = $this->columnToArray($fieldMapping); - - if (isset($mapping['version'])) { - $metadata->setVersionMapping($mapping); - unset($mapping['version']); - } - - $metadata->mapField($mapping); - } - } - - if (isset($xmlRoot->embedded)) { - foreach ($xmlRoot->embedded as $embeddedMapping) { - $columnPrefix = isset($embeddedMapping['column-prefix']) - ? (string) $embeddedMapping['column-prefix'] - : null; - - $useColumnPrefix = isset($embeddedMapping['use-column-prefix']) - ? $this->evaluateBoolean($embeddedMapping['use-column-prefix']) - : true; - - $mapping = [ - 'fieldName' => (string) $embeddedMapping['name'], - 'class' => isset($embeddedMapping['class']) ? (string) $embeddedMapping['class'] : null, - 'columnPrefix' => $useColumnPrefix ? $columnPrefix : false, - ]; - - $metadata->mapEmbedded($mapping); - } - } - - // Evaluate mappings - $associationIds = []; - foreach ($xmlRoot->id ?? [] as $idElement) { - if (isset($idElement['association-key']) && $this->evaluateBoolean($idElement['association-key'])) { - $associationIds[(string) $idElement['name']] = true; - continue; - } - - $mapping = $this->columnToArray($idElement); - $mapping['id'] = true; - - $metadata->mapField($mapping); - - if (isset($idElement->generator)) { - $strategy = isset($idElement->generator['strategy']) ? - (string) $idElement->generator['strategy'] : 'AUTO'; - $metadata->setIdGeneratorType(constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_' - . $strategy)); - } - - // Check for SequenceGenerator/TableGenerator definition - if (isset($idElement->{'sequence-generator'})) { - $seqGenerator = $idElement->{'sequence-generator'}; - $metadata->setSequenceGeneratorDefinition( - [ - 'sequenceName' => (string) $seqGenerator['sequence-name'], - 'allocationSize' => (string) $seqGenerator['allocation-size'], - 'initialValue' => (string) $seqGenerator['initial-value'], - ], - ); - } elseif (isset($idElement->{'custom-id-generator'})) { - $customGenerator = $idElement->{'custom-id-generator'}; - $metadata->setCustomGeneratorDefinition( - [ - 'class' => (string) $customGenerator['class'], - ], - ); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'one-to-one'})) { - foreach ($xmlRoot->{'one-to-one'} as $oneToOneElement) { - $mapping = [ - 'fieldName' => (string) $oneToOneElement['field'], - ]; - - if (isset($oneToOneElement['target-entity'])) { - $mapping['targetEntity'] = (string) $oneToOneElement['target-entity']; - } - - if (isset($associationIds[$mapping['fieldName']])) { - $mapping['id'] = true; - } - - if (isset($oneToOneElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . (string) $oneToOneElement['fetch']); - } - - if (isset($oneToOneElement['mapped-by'])) { - $mapping['mappedBy'] = (string) $oneToOneElement['mapped-by']; - } else { - if (isset($oneToOneElement['inversed-by'])) { - $mapping['inversedBy'] = (string) $oneToOneElement['inversed-by']; - } - - $joinColumns = []; - - if (isset($oneToOneElement->{'join-column'})) { - $joinColumns[] = $this->joinColumnToArray($oneToOneElement->{'join-column'}); - } elseif (isset($oneToOneElement->{'join-columns'})) { - foreach ($oneToOneElement->{'join-columns'}->{'join-column'} ?? [] as $joinColumnElement) { - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - } - - $mapping['joinColumns'] = $joinColumns; - } - - if (isset($oneToOneElement->cascade)) { - $mapping['cascade'] = $this->getCascadeMappings($oneToOneElement->cascade); - } - - if (isset($oneToOneElement['orphan-removal'])) { - $mapping['orphanRemoval'] = $this->evaluateBoolean($oneToOneElement['orphan-removal']); - } - - // Evaluate second level cache - if (isset($oneToOneElement->cache)) { - $mapping['cache'] = $metadata->getAssociationCacheDefaults($mapping['fieldName'], $this->cacheToArray($oneToOneElement->cache)); - } - - $metadata->mapOneToOne($mapping); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'one-to-many'})) { - foreach ($xmlRoot->{'one-to-many'} as $oneToManyElement) { - $mapping = [ - 'fieldName' => (string) $oneToManyElement['field'], - 'mappedBy' => (string) $oneToManyElement['mapped-by'], - ]; - - if (isset($oneToManyElement['target-entity'])) { - $mapping['targetEntity'] = (string) $oneToManyElement['target-entity']; - } - - if (isset($oneToManyElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . (string) $oneToManyElement['fetch']); - } - - if (isset($oneToManyElement->cascade)) { - $mapping['cascade'] = $this->getCascadeMappings($oneToManyElement->cascade); - } - - if (isset($oneToManyElement['orphan-removal'])) { - $mapping['orphanRemoval'] = $this->evaluateBoolean($oneToManyElement['orphan-removal']); - } - - if (isset($oneToManyElement->{'order-by'})) { - $orderBy = []; - foreach ($oneToManyElement->{'order-by'}->{'order-by-field'} ?? [] as $orderByField) { - /** @psalm-suppress DeprecatedConstant */ - $orderBy[(string) $orderByField['name']] = isset($orderByField['direction']) - ? (string) $orderByField['direction'] - : (enum_exists(Order::class) ? Order::Ascending->value : Criteria::ASC); - } - - $mapping['orderBy'] = $orderBy; - } - - if (isset($oneToManyElement['index-by'])) { - $mapping['indexBy'] = (string) $oneToManyElement['index-by']; - } elseif (isset($oneToManyElement->{'index-by'})) { - throw new InvalidArgumentException(' is not a valid tag'); - } - - // Evaluate second level cache - if (isset($oneToManyElement->cache)) { - $mapping['cache'] = $metadata->getAssociationCacheDefaults($mapping['fieldName'], $this->cacheToArray($oneToManyElement->cache)); - } - - $metadata->mapOneToMany($mapping); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'many-to-one'})) { - foreach ($xmlRoot->{'many-to-one'} as $manyToOneElement) { - $mapping = [ - 'fieldName' => (string) $manyToOneElement['field'], - ]; - - if (isset($manyToOneElement['target-entity'])) { - $mapping['targetEntity'] = (string) $manyToOneElement['target-entity']; - } - - if (isset($associationIds[$mapping['fieldName']])) { - $mapping['id'] = true; - } - - if (isset($manyToOneElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . (string) $manyToOneElement['fetch']); - } - - if (isset($manyToOneElement['inversed-by'])) { - $mapping['inversedBy'] = (string) $manyToOneElement['inversed-by']; - } - - $joinColumns = []; - - if (isset($manyToOneElement->{'join-column'})) { - $joinColumns[] = $this->joinColumnToArray($manyToOneElement->{'join-column'}); - } elseif (isset($manyToOneElement->{'join-columns'})) { - foreach ($manyToOneElement->{'join-columns'}->{'join-column'} ?? [] as $joinColumnElement) { - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - } - - $mapping['joinColumns'] = $joinColumns; - - if (isset($manyToOneElement->cascade)) { - $mapping['cascade'] = $this->getCascadeMappings($manyToOneElement->cascade); - } - - // Evaluate second level cache - if (isset($manyToOneElement->cache)) { - $mapping['cache'] = $metadata->getAssociationCacheDefaults($mapping['fieldName'], $this->cacheToArray($manyToOneElement->cache)); - } - - $metadata->mapManyToOne($mapping); - } - } - - // Evaluate mappings - if (isset($xmlRoot->{'many-to-many'})) { - foreach ($xmlRoot->{'many-to-many'} as $manyToManyElement) { - $mapping = [ - 'fieldName' => (string) $manyToManyElement['field'], - ]; - - if (isset($manyToManyElement['target-entity'])) { - $mapping['targetEntity'] = (string) $manyToManyElement['target-entity']; - } - - if (isset($manyToManyElement['fetch'])) { - $mapping['fetch'] = constant('Doctrine\ORM\Mapping\ClassMetadata::FETCH_' . (string) $manyToManyElement['fetch']); - } - - if (isset($manyToManyElement['orphan-removal'])) { - $mapping['orphanRemoval'] = $this->evaluateBoolean($manyToManyElement['orphan-removal']); - } - - if (isset($manyToManyElement['mapped-by'])) { - $mapping['mappedBy'] = (string) $manyToManyElement['mapped-by']; - } elseif (isset($manyToManyElement->{'join-table'})) { - if (isset($manyToManyElement['inversed-by'])) { - $mapping['inversedBy'] = (string) $manyToManyElement['inversed-by']; - } - - $joinTableElement = $manyToManyElement->{'join-table'}; - $joinTable = [ - 'name' => (string) $joinTableElement['name'], - ]; - - if (isset($joinTableElement['schema'])) { - $joinTable['schema'] = (string) $joinTableElement['schema']; - } - - if (isset($joinTableElement->options)) { - $joinTable['options'] = $this->parseOptions($joinTableElement->options->children()); - } - - foreach ($joinTableElement->{'join-columns'}->{'join-column'} ?? [] as $joinColumnElement) { - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - - foreach ($joinTableElement->{'inverse-join-columns'}->{'join-column'} ?? [] as $joinColumnElement) { - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - - $mapping['joinTable'] = $joinTable; - } - - if (isset($manyToManyElement->cascade)) { - $mapping['cascade'] = $this->getCascadeMappings($manyToManyElement->cascade); - } - - if (isset($manyToManyElement->{'order-by'})) { - $orderBy = []; - foreach ($manyToManyElement->{'order-by'}->{'order-by-field'} ?? [] as $orderByField) { - /** @psalm-suppress DeprecatedConstant */ - $orderBy[(string) $orderByField['name']] = isset($orderByField['direction']) - ? (string) $orderByField['direction'] - : (enum_exists(Order::class) ? Order::Ascending->value : Criteria::ASC); - } - - $mapping['orderBy'] = $orderBy; - } - - if (isset($manyToManyElement['index-by'])) { - $mapping['indexBy'] = (string) $manyToManyElement['index-by']; - } elseif (isset($manyToManyElement->{'index-by'})) { - throw new InvalidArgumentException(' is not a valid tag'); - } - - // Evaluate second level cache - if (isset($manyToManyElement->cache)) { - $mapping['cache'] = $metadata->getAssociationCacheDefaults($mapping['fieldName'], $this->cacheToArray($manyToManyElement->cache)); - } - - $metadata->mapManyToMany($mapping); - } - } - - // Evaluate association-overrides - if (isset($xmlRoot->{'attribute-overrides'})) { - foreach ($xmlRoot->{'attribute-overrides'}->{'attribute-override'} ?? [] as $overrideElement) { - $fieldName = (string) $overrideElement['name']; - foreach ($overrideElement->field ?? [] as $field) { - $mapping = $this->columnToArray($field); - $mapping['fieldName'] = $fieldName; - $metadata->setAttributeOverride($fieldName, $mapping); - } - } - } - - // Evaluate association-overrides - if (isset($xmlRoot->{'association-overrides'})) { - foreach ($xmlRoot->{'association-overrides'}->{'association-override'} ?? [] as $overrideElement) { - $fieldName = (string) $overrideElement['name']; - $override = []; - - // Check for join-columns - if (isset($overrideElement->{'join-columns'})) { - $joinColumns = []; - foreach ($overrideElement->{'join-columns'}->{'join-column'} ?? [] as $joinColumnElement) { - $joinColumns[] = $this->joinColumnToArray($joinColumnElement); - } - - $override['joinColumns'] = $joinColumns; - } - - // Check for join-table - if ($overrideElement->{'join-table'}) { - $joinTable = null; - $joinTableElement = $overrideElement->{'join-table'}; - - $joinTable = [ - 'name' => (string) $joinTableElement['name'], - 'schema' => (string) $joinTableElement['schema'], - ]; - - if (isset($joinTableElement->options)) { - $joinTable['options'] = $this->parseOptions($joinTableElement->options->children()); - } - - if (isset($joinTableElement->{'join-columns'})) { - foreach ($joinTableElement->{'join-columns'}->{'join-column'} ?? [] as $joinColumnElement) { - $joinTable['joinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - } - - if (isset($joinTableElement->{'inverse-join-columns'})) { - foreach ($joinTableElement->{'inverse-join-columns'}->{'join-column'} ?? [] as $joinColumnElement) { - $joinTable['inverseJoinColumns'][] = $this->joinColumnToArray($joinColumnElement); - } - } - - $override['joinTable'] = $joinTable; - } - - // Check for inversed-by - if (isset($overrideElement->{'inversed-by'})) { - $override['inversedBy'] = (string) $overrideElement->{'inversed-by'}['name']; - } - - // Check for `fetch` - if (isset($overrideElement['fetch'])) { - $override['fetch'] = constant(ClassMetadata::class . '::FETCH_' . (string) $overrideElement['fetch']); - } - - $metadata->setAssociationOverride($fieldName, $override); - } - } - - // Evaluate - if (isset($xmlRoot->{'lifecycle-callbacks'})) { - foreach ($xmlRoot->{'lifecycle-callbacks'}->{'lifecycle-callback'} ?? [] as $lifecycleCallback) { - $metadata->addLifecycleCallback((string) $lifecycleCallback['method'], constant('Doctrine\ORM\Events::' . (string) $lifecycleCallback['type'])); - } - } - - // Evaluate entity listener - if (isset($xmlRoot->{'entity-listeners'})) { - foreach ($xmlRoot->{'entity-listeners'}->{'entity-listener'} ?? [] as $listenerElement) { - $className = (string) $listenerElement['class']; - // Evaluate the listener using naming convention. - if ($listenerElement->count() === 0) { - EntityListenerBuilder::bindEntityListener($metadata, $className); - - continue; - } - - foreach ($listenerElement as $callbackElement) { - $eventName = (string) $callbackElement['type']; - $methodName = (string) $callbackElement['method']; - - $metadata->addEntityListener($eventName, $className, $methodName); - } - } - } - } - - /** - * Parses (nested) option elements. - * - * @return mixed[] The options array. - * @psalm-return array|bool|string> - */ - private function parseOptions(SimpleXMLElement|null $options): array - { - $array = []; - - foreach ($options ?? [] as $option) { - if ($option->count()) { - $value = $this->parseOptions($option->children()); - } else { - $value = (string) $option; - } - - $attributes = $option->attributes(); - - if (isset($attributes->name)) { - $nameAttribute = (string) $attributes->name; - $array[$nameAttribute] = in_array($nameAttribute, ['unsigned', 'fixed'], true) - ? $this->evaluateBoolean($value) - : $value; - } else { - $array[] = $value; - } - } - - return $array; - } - - /** - * Constructs a joinColumn mapping array based on the information - * found in the given SimpleXMLElement. - * - * @param SimpleXMLElement $joinColumnElement The XML element. - * - * @return mixed[] The mapping array. - * @psalm-return array{ - * name: string, - * referencedColumnName: string, - * unique?: bool, - * nullable?: bool, - * onDelete?: string, - * columnDefinition?: string, - * options?: mixed[] - * } - */ - private function joinColumnToArray(SimpleXMLElement $joinColumnElement): array - { - $joinColumn = [ - 'name' => (string) $joinColumnElement['name'], - 'referencedColumnName' => (string) $joinColumnElement['referenced-column-name'], - ]; - - if (isset($joinColumnElement['unique'])) { - $joinColumn['unique'] = $this->evaluateBoolean($joinColumnElement['unique']); - } - - if (isset($joinColumnElement['nullable'])) { - $joinColumn['nullable'] = $this->evaluateBoolean($joinColumnElement['nullable']); - } - - if (isset($joinColumnElement['on-delete'])) { - $joinColumn['onDelete'] = (string) $joinColumnElement['on-delete']; - } - - if (isset($joinColumnElement['column-definition'])) { - $joinColumn['columnDefinition'] = (string) $joinColumnElement['column-definition']; - } - - if (isset($joinColumnElement['options'])) { - $joinColumn['options'] = $this->parseOptions($joinColumnElement['options'] ? $joinColumnElement['options']->children() : null); - } - - return $joinColumn; - } - - /** - * Parses the given field as array. - * - * @return mixed[] - * @psalm-return array{ - * fieldName: string, - * type?: string, - * columnName?: string, - * length?: int, - * precision?: int, - * scale?: int, - * unique?: bool, - * nullable?: bool, - * notInsertable?: bool, - * notUpdatable?: bool, - * enumType?: string, - * version?: bool, - * columnDefinition?: string, - * options?: array - * } - */ - private function columnToArray(SimpleXMLElement $fieldMapping): array - { - $mapping = [ - 'fieldName' => (string) $fieldMapping['name'], - ]; - - if (isset($fieldMapping['type'])) { - $mapping['type'] = (string) $fieldMapping['type']; - } - - if (isset($fieldMapping['column'])) { - $mapping['columnName'] = (string) $fieldMapping['column']; - } - - if (isset($fieldMapping['length'])) { - $mapping['length'] = (int) $fieldMapping['length']; - } - - if (isset($fieldMapping['precision'])) { - $mapping['precision'] = (int) $fieldMapping['precision']; - } - - if (isset($fieldMapping['scale'])) { - $mapping['scale'] = (int) $fieldMapping['scale']; - } - - if (isset($fieldMapping['unique'])) { - $mapping['unique'] = $this->evaluateBoolean($fieldMapping['unique']); - } - - if (isset($fieldMapping['nullable'])) { - $mapping['nullable'] = $this->evaluateBoolean($fieldMapping['nullable']); - } - - if (isset($fieldMapping['insertable']) && ! $this->evaluateBoolean($fieldMapping['insertable'])) { - $mapping['notInsertable'] = true; - } - - if (isset($fieldMapping['updatable']) && ! $this->evaluateBoolean($fieldMapping['updatable'])) { - $mapping['notUpdatable'] = true; - } - - if (isset($fieldMapping['generated'])) { - $mapping['generated'] = constant('Doctrine\ORM\Mapping\ClassMetadata::GENERATED_' . (string) $fieldMapping['generated']); - } - - if (isset($fieldMapping['version']) && $fieldMapping['version']) { - $mapping['version'] = $this->evaluateBoolean($fieldMapping['version']); - } - - if (isset($fieldMapping['column-definition'])) { - $mapping['columnDefinition'] = (string) $fieldMapping['column-definition']; - } - - if (isset($fieldMapping['enum-type'])) { - $mapping['enumType'] = (string) $fieldMapping['enum-type']; - } - - if (isset($fieldMapping->options)) { - $mapping['options'] = $this->parseOptions($fieldMapping->options->children()); - } - - return $mapping; - } - - /** - * Parse / Normalize the cache configuration - * - * @return mixed[] - * @psalm-return array{usage: int|null, region?: string} - */ - private function cacheToArray(SimpleXMLElement $cacheMapping): array - { - $region = isset($cacheMapping['region']) ? (string) $cacheMapping['region'] : null; - $usage = isset($cacheMapping['usage']) ? strtoupper((string) $cacheMapping['usage']) : null; - - if ($usage && ! defined('Doctrine\ORM\Mapping\ClassMetadata::CACHE_USAGE_' . $usage)) { - throw new InvalidArgumentException(sprintf('Invalid cache usage "%s"', $usage)); - } - - if ($usage) { - $usage = (int) constant('Doctrine\ORM\Mapping\ClassMetadata::CACHE_USAGE_' . $usage); - } - - return [ - 'usage' => $usage, - 'region' => $region, - ]; - } - - /** - * Gathers a list of cascade options found in the given cascade element. - * - * @param SimpleXMLElement $cascadeElement The cascade element. - * - * @return string[] The list of cascade options. - * @psalm-return list - */ - private function getCascadeMappings(SimpleXMLElement $cascadeElement): array - { - $cascades = []; - $children = $cascadeElement->children(); - assert($children !== null); - - foreach ($children as $action) { - // According to the JPA specifications, XML uses "cascade-persist" - // instead of "persist". Here, both variations - // are supported because Attribute uses "persist" - // and we want to make sure that this driver doesn't need to know - // anything about the supported cascading actions - $cascades[] = str_replace('cascade-', '', $action->getName()); - } - - return $cascades; - } - - /** - * {@inheritDoc} - */ - protected function loadMappingFile($file) - { - $this->validateMapping($file); - $result = []; - // Note: we do not use `simplexml_load_file()` because of https://bugs.php.net/bug.php?id=62577 - $xmlElement = simplexml_load_string(file_get_contents($file)); - assert($xmlElement !== false); - - if (isset($xmlElement->entity)) { - foreach ($xmlElement->entity as $entityElement) { - /** @psalm-var class-string $entityName */ - $entityName = (string) $entityElement['name']; - $result[$entityName] = $entityElement; - } - } elseif (isset($xmlElement->{'mapped-superclass'})) { - foreach ($xmlElement->{'mapped-superclass'} as $mappedSuperClass) { - /** @psalm-var class-string $className */ - $className = (string) $mappedSuperClass['name']; - $result[$className] = $mappedSuperClass; - } - } elseif (isset($xmlElement->embeddable)) { - foreach ($xmlElement->embeddable as $embeddableElement) { - /** @psalm-var class-string $embeddableName */ - $embeddableName = (string) $embeddableElement['name']; - $result[$embeddableName] = $embeddableElement; - } - } - - return $result; - } - - private function validateMapping(string $file): void - { - if (! $this->isXsdValidationEnabled) { - return; - } - - $backedUpErrorSetting = libxml_use_internal_errors(true); - - try { - $document = new DOMDocument(); - $document->load($file); - - if (! $document->schemaValidate(__DIR__ . '/../../../doctrine-mapping.xsd')) { - throw MappingException::fromLibXmlErrors(libxml_get_errors()); - } - } finally { - libxml_clear_errors(); - libxml_use_internal_errors($backedUpErrorSetting); - } - } - - protected function evaluateBoolean(mixed $element): bool - { - $flag = (string) $element; - - return $flag === 'true' || $flag === '1'; - } -} -- cgit v1.2.3