diff --git a/composer.json b/composer.json index f7b965bb550..fd3d01f08cb 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "doctrine/doctrine-bundle": "^1.12 || ^2.0", "doctrine/mongodb-odm": "^2.2", "doctrine/mongodb-odm-bundle": "^4.0 || ^5.0", - "doctrine/orm": "^2.14", + "doctrine/orm": "^2.14 || ^3.0", "elasticsearch/elasticsearch": "^7.11 || ^8.4", "friends-of-behat/mink-browserkit-driver": "^1.3.1", "friends-of-behat/mink-extension": "^2.2", diff --git a/src/Doctrine/Common/Tests/State/PersistProcessorTest.php b/src/Doctrine/Common/Tests/State/PersistProcessorTest.php index 8b83dd9dd4c..1793614040a 100644 --- a/src/Doctrine/Common/Tests/State/PersistProcessorTest.php +++ b/src/Doctrine/Common/Tests/State/PersistProcessorTest.php @@ -18,7 +18,7 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\State\ProcessorInterface; use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\ClassMetadata as ORMClassMetadata; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ObjectManager; use PHPUnit\Framework\TestCase; @@ -84,8 +84,8 @@ public function testPersistWithNullManager(): void public static function getTrackingPolicyParameters(): array { return [ - 'deferred explicit ORM' => [ClassMetadataInfo::class, true, true], - 'deferred implicit ORM' => [ClassMetadataInfo::class, false, false], + 'deferred explicit ORM' => [ORMClassMetadata::class, true, true], + 'deferred implicit ORM' => [ORMClassMetadata::class, false, false], 'deferred explicit ODM' => [ClassMetadata::class, true, true], 'deferred implicit ODM' => [ClassMetadata::class, false, false], ]; @@ -98,15 +98,15 @@ public function testTrackingPolicy(string $metadataClass, bool $deferredExplicit { $dummy = new Dummy(); - $classMetadataInfo = $this->prophesize($metadataClass); + $classMetadata = $this->prophesize($metadataClass); if (method_exists($metadataClass, 'isChangeTrackingDeferredExplicit')) { - $classMetadataInfo->isChangeTrackingDeferredExplicit()->willReturn($deferredExplicit)->shouldBeCalled(); + $classMetadata->isChangeTrackingDeferredExplicit()->willReturn($deferredExplicit)->shouldBeCalled(); } else { $persisted = false; } $objectManagerProphecy = $this->prophesize(ObjectManager::class); - $objectManagerProphecy->getClassMetadata(Dummy::class)->willReturn($classMetadataInfo)->shouldBeCalled(); + $objectManagerProphecy->getClassMetadata(Dummy::class)->willReturn($classMetadata)->shouldBeCalled(); $objectManagerProphecy->contains($dummy)->willReturn(true); $objectManagerProphecy->persist($dummy)->should($persisted ? new CallPrediction() : new NoCallsPrediction()); $objectManagerProphecy->flush()->shouldBeCalled(); diff --git a/src/Doctrine/Orm/Extension/EagerLoadingExtension.php b/src/Doctrine/Orm/Extension/EagerLoadingExtension.php index 49f63b449f6..e04bf2ed8e9 100644 --- a/src/Doctrine/Orm/Extension/EagerLoadingExtension.php +++ b/src/Doctrine/Orm/Extension/EagerLoadingExtension.php @@ -23,7 +23,6 @@ use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface; use ApiPlatform\Metadata\Property\Factory\PropertyNameCollectionFactoryInterface; use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\Query\Expr\Select; use Doctrine\ORM\QueryBuilder; @@ -137,9 +136,9 @@ private function joinRelations(QueryBuilder $queryBuilder, QueryNameGeneratorInt if ( // Always skip extra lazy associations - ClassMetadataInfo::FETCH_EXTRA_LAZY === $mapping['fetch'] + ClassMetadata::FETCH_EXTRA_LAZY === $mapping['fetch'] // We don't want to interfere with doctrine on this association - || (false === $forceEager && ClassMetadataInfo::FETCH_EAGER !== $mapping['fetch']) + || (false === $forceEager && ClassMetadata::FETCH_EAGER !== $mapping['fetch']) ) { continue; } diff --git a/src/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php b/src/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php index 31170db96cd..daba5d97f9d 100644 --- a/src/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php +++ b/src/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php @@ -19,7 +19,7 @@ use ApiPlatform\Metadata\Operation; use ApiPlatform\Metadata\ResourceClassResolverInterface; use Doctrine\ORM\EntityManagerInterface; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; @@ -111,12 +111,12 @@ public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGenerator * * @param array $checked array cache of tested metadata classes */ - private function hasFetchEagerAssociation(EntityManagerInterface $em, ClassMetadataInfo $classMetadata, array &$checked = []): bool + private function hasFetchEagerAssociation(EntityManagerInterface $em, ClassMetadata $classMetadata, array &$checked = []): bool { $checked[] = $classMetadata->name; foreach ($classMetadata->getAssociationMappings() as $mapping) { - if (ClassMetadataInfo::FETCH_EAGER === $mapping['fetch']) { + if (ClassMetadata::FETCH_EAGER === $mapping['fetch']) { return true; } diff --git a/src/Doctrine/Orm/Filter/ExistsFilter.php b/src/Doctrine/Orm/Filter/ExistsFilter.php index db0db4b3ec8..c5578d1b03d 100644 --- a/src/Doctrine/Orm/Filter/ExistsFilter.php +++ b/src/Doctrine/Orm/Filter/ExistsFilter.php @@ -18,7 +18,7 @@ use ApiPlatform\Doctrine\Orm\Util\QueryBuilderHelper; use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface; use ApiPlatform\Metadata\Operation; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; @@ -199,7 +199,7 @@ protected function isNullableField(string $property, string $resourceClass): boo if ($metadata->hasAssociation($field)) { if ($metadata->isSingleValuedAssociation($field)) { - if (!($metadata instanceof ClassMetadataInfo)) { + if (!($metadata instanceof ClassMetadata)) { return false; } @@ -211,7 +211,7 @@ protected function isNullableField(string $property, string $resourceClass): boo return true; } - if ($metadata instanceof ClassMetadataInfo && $metadata->hasField($field)) { + if ($metadata instanceof ClassMetadata && $metadata->hasField($field)) { return $metadata->isNullable($field); } diff --git a/src/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php b/src/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php index d3e48165236..1d1d1ccde34 100644 --- a/src/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php +++ b/src/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php @@ -15,7 +15,7 @@ use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\Persistence\ManagerRegistry; /** @@ -55,7 +55,7 @@ public function create(string $resourceClass, string $property, array $options = break; } - if ($doctrineClassMetadata instanceof ClassMetadataInfo) { + if ($doctrineClassMetadata instanceof ClassMetadata) { $writable = $doctrineClassMetadata->isIdentifierNatural(); } else { $writable = false; @@ -67,7 +67,7 @@ public function create(string $resourceClass, string $property, array $options = } } - if ($doctrineClassMetadata instanceof ClassMetadataInfo && \in_array($property, $doctrineClassMetadata->getFieldNames(), true)) { + if ($doctrineClassMetadata instanceof ClassMetadata && \in_array($property, $doctrineClassMetadata->getFieldNames(), true)) { /** @var mixed[] */ $fieldMapping = $doctrineClassMetadata->getFieldMapping($property); $propertyMetadata = $propertyMetadata->withDefault($fieldMapping['options']['default'] ?? $propertyMetadata->getDefault()); diff --git a/src/Doctrine/Orm/Metadata/Resource/DoctrineOrmLinkFactory.php b/src/Doctrine/Orm/Metadata/Resource/DoctrineOrmLinkFactory.php index ba3dcc315c8..789594593f4 100644 --- a/src/Doctrine/Orm/Metadata/Resource/DoctrineOrmLinkFactory.php +++ b/src/Doctrine/Orm/Metadata/Resource/DoctrineOrmLinkFactory.php @@ -21,6 +21,7 @@ use ApiPlatform\Metadata\Resource\Factory\PropertyLinkFactoryInterface; use ApiPlatform\Metadata\ResourceClassResolverInterface; use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\Mapping\InverseSideMapping; use Doctrine\Persistence\ManagerRegistry; /** @@ -66,8 +67,20 @@ public function createLinksFromRelations(Metadata $operation): array continue; } + if (class_exists(InverseSideMapping::class)) { + // Doctrine throws on getAssociationMappedByTargetField, we want to avoid catching exceptions in this hot path + $assoc = $doctrineMetadata->getAssociationMapping($property); + if (!$assoc instanceof InverseSideMapping) { + continue; + } + } + + if (!($mappedBy = $doctrineMetadata->getAssociationMappedByTargetField($property) ?? null)) { + continue; + } + $relationClass = $doctrineMetadata->getAssociationTargetClass($property); - if (!($mappedBy = $doctrineMetadata->getAssociationMappedByTargetField($property)) || !$this->resourceClassResolver->isResourceClass($relationClass)) { + if (!$this->resourceClassResolver->isResourceClass($relationClass)) { continue; } diff --git a/src/Doctrine/Orm/State/LinksHandlerTrait.php b/src/Doctrine/Orm/State/LinksHandlerTrait.php index 585195da4f7..9c9f268e5c0 100644 --- a/src/Doctrine/Orm/State/LinksHandlerTrait.php +++ b/src/Doctrine/Orm/State/LinksHandlerTrait.php @@ -17,7 +17,7 @@ use ApiPlatform\Doctrine\Orm\Util\QueryNameGenerator; use ApiPlatform\Metadata\Link; use ApiPlatform\Metadata\Operation; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\QueryBuilder; /** @@ -83,7 +83,7 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que $associationMapping = $fromClassMetadata->getAssociationMapping($link->getFromProperty()); // @phpstan-ignore-line $relationType = $associationMapping['type']; - if ($relationType & ClassMetadataInfo::TO_MANY) { + if ($relationType & ClassMetadata::TO_MANY) { $nextAlias = $queryNameGenerator->generateJoinAlias($alias); $whereClause = []; foreach ($identifierProperties as $identifierProperty) { @@ -100,7 +100,7 @@ private function handleLinks(QueryBuilder $queryBuilder, array $identifiers, Que } // A single-valued association path expression to an inverse side is not supported in DQL queries. - if ($relationType & ClassMetadataInfo::TO_ONE && !($associationMapping['isOwningSide'] ?? true)) { + if ($relationType & ClassMetadata::TO_ONE && !($associationMapping['isOwningSide'] ?? true)) { $queryBuilder->innerJoin("$previousAlias.".$associationMapping['mappedBy'], $joinAlias); } else { $queryBuilder->join( diff --git a/tests/Doctrine/Orm/Extension/EagerLoadingExtensionTest.php b/tests/Doctrine/Orm/Extension/EagerLoadingExtensionTest.php index 922880847a8..b1e38c1fa83 100644 --- a/tests/Doctrine/Orm/Extension/EagerLoadingExtensionTest.php +++ b/tests/Doctrine/Orm/Extension/EagerLoadingExtensionTest.php @@ -35,7 +35,6 @@ use ApiPlatform\Tests\Fixtures\TestBundle\Entity\UnknownDummy; use Doctrine\ORM\EntityManager; use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use PHPUnit\Framework\TestCase; @@ -95,8 +94,8 @@ public function testApplyToCollection(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], - 'relatedDummy2' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy2' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], ]; $relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class); @@ -182,13 +181,13 @@ public function testApplyToItem(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], - 'relatedDummy2' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => UnknownDummy::class], - 'relatedDummy3' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinTable' => ['joinColumns' => [['nullable' => false]]], 'targetEntity' => UnknownDummy::class], - 'relatedDummy4' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'targetEntity' => UnknownDummy::class], - 'relatedDummy5' => ['fetch' => ClassMetadataInfo::FETCH_LAZY, 'targetEntity' => UnknownDummy::class], - 'singleInheritanceRelation' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'targetEntity' => AbstractDummy::class], - 'relatedDummies' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy2' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => UnknownDummy::class], + 'relatedDummy3' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinTable' => ['joinColumns' => [['nullable' => false]]], 'targetEntity' => UnknownDummy::class], + 'relatedDummy4' => ['fetch' => ClassMetadata::FETCH_EAGER, 'targetEntity' => UnknownDummy::class], + 'relatedDummy5' => ['fetch' => ClassMetadata::FETCH_LAZY, 'targetEntity' => UnknownDummy::class], + 'singleInheritanceRelation' => ['fetch' => ClassMetadata::FETCH_EAGER, 'targetEntity' => AbstractDummy::class], + 'relatedDummies' => ['fetch' => ClassMetadata::FETCH_EAGER, 'targetEntity' => RelatedDummy::class], ]; $relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class); @@ -201,8 +200,8 @@ public function testApplyToItem(): void $relatedClassMetadataProphecy->hasField('embeddedDummy.name')->willReturn(true)->shouldBeCalled(); $relatedClassMetadataProphecy->associationMappings = [ - 'relation' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => UnknownDummy::class], - 'thirdLevel' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'targetEntity' => ThirdLevel::class, 'sourceEntity' => RelatedDummy::class, 'inversedBy' => 'relatedDummies', 'type' => ClassMetadata::TO_ONE], + 'relation' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => UnknownDummy::class], + 'thirdLevel' => ['fetch' => ClassMetadata::FETCH_EAGER, 'targetEntity' => ThirdLevel::class, 'sourceEntity' => RelatedDummy::class, 'inversedBy' => 'relatedDummies', 'type' => ClassMetadata::TO_ONE], ]; $relatedClassMetadataProphecy->embeddedClasses = ['embeddedDummy' => ['class' => EmbeddableDummy::class]]; @@ -362,12 +361,12 @@ public function testMaxJoinsReached(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], ]; $relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class); $relatedClassMetadataProphecy->associationMappings = [ - 'dummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => Dummy::class], + 'dummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => Dummy::class], ]; $emProphecy = $this->prophesize(EntityManager::class); @@ -409,12 +408,12 @@ public function testMaxDepth(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], ]; $relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class); $relatedClassMetadataProphecy->associationMappings = [ - 'dummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => Dummy::class], + 'dummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => Dummy::class], ]; $dummyClassMetadataInterfaceProphecy = $this->prophesize(ClassMetadataInterface::class); @@ -468,7 +467,7 @@ public function testForceEager(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relation' => ['fetch' => ClassMetadataInfo::FETCH_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], + 'relation' => ['fetch' => ClassMetadata::FETCH_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], ]; $unknownClassMetadataProphecy = $this->prophesize(ClassMetadata::class); @@ -504,7 +503,7 @@ public function testExtraLazy(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relation' => ['fetch' => ClassMetadataInfo::FETCH_EXTRA_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], + 'relation' => ['fetch' => ClassMetadata::FETCH_EXTRA_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], ]; $unknownClassMetadataProphecy = $this->prophesize(ClassMetadata::class); @@ -529,7 +528,7 @@ public function testResourceClassNotFoundException(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relation' => ['fetch' => ClassMetadataInfo::FETCH_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], + 'relation' => ['fetch' => ClassMetadata::FETCH_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], ]; $emProphecy = $this->prophesize(EntityManager::class); $emProphecy->getClassMetadata(Dummy::class)->shouldBeCalled()->willReturn($classMetadataProphecy->reveal()); @@ -550,7 +549,7 @@ public function testPropertyNotFoundException(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relation' => ['fetch' => ClassMetadataInfo::FETCH_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], + 'relation' => ['fetch' => ClassMetadata::FETCH_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], ]; $emProphecy = $this->prophesize(EntityManager::class); $emProphecy->getClassMetadata(Dummy::class)->shouldBeCalled()->willReturn($classMetadataProphecy->reveal()); @@ -574,7 +573,7 @@ public function testResourceClassNotFoundExceptionPropertyNameCollection(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relation' => ['fetch' => ClassMetadataInfo::FETCH_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], + 'relation' => ['fetch' => ClassMetadata::FETCH_LAZY, 'targetEntity' => UnknownDummy::class, 'joinColumns' => [['nullable' => false]]], ]; $emProphecy = $this->prophesize(EntityManager::class); $emProphecy->getClassMetadata(Dummy::class)->shouldBeCalled()->willReturn($classMetadataProphecy->reveal()); @@ -615,8 +614,8 @@ public function testAttributes(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummies' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummies' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], ]; $relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class); @@ -703,8 +702,8 @@ public function testOnlyOneRelationNotInAttributes(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummies' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummies' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], ]; $relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class); @@ -748,8 +747,8 @@ public function testApplyToCollectionNoPartial(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], - 'relatedDummy2' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy2' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], ]; $emProphecy = $this->prophesize(EntityManager::class); @@ -793,8 +792,8 @@ public function testApplyToCollectionWithANonReadableButFetchEagerProperty(): vo $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], - 'relatedDummy2' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy2' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], ]; $emProphecy = $this->prophesize(EntityManager::class); @@ -838,7 +837,7 @@ public function testApplyToCollectionWithExistingJoin(string $joinType): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], ]; $relatedClassMetadataProphecy = $this->prophesize(ClassMetadata::class); @@ -885,8 +884,8 @@ public function testApplyToCollectionWithAReadableButNotFetchEagerProperty(): vo $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'relatedDummy' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], - 'relatedDummy2' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => RelatedDummy::class], + 'relatedDummy2' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => false]], 'targetEntity' => RelatedDummy::class], ]; $emProphecy = $this->prophesize(EntityManager::class); @@ -923,7 +922,7 @@ public function testAvoidFetchCollectionOnIriOnlyProperty(): void $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->associationMappings = [ - 'propertyCollectionIriOnlyRelation' => ['fetch' => ClassMetadataInfo::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => PropertyCollectionIriOnlyRelation::class], + 'propertyCollectionIriOnlyRelation' => ['fetch' => ClassMetadata::FETCH_EAGER, 'joinColumns' => [['nullable' => true]], 'targetEntity' => PropertyCollectionIriOnlyRelation::class], ]; $emProphecy = $this->prophesize(EntityManager::class); diff --git a/tests/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php b/tests/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php index fbbce89f3ed..96f71cedd41 100644 --- a/tests/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php +++ b/tests/Doctrine/Orm/Extension/FilterEagerLoadingExtensionTest.php @@ -25,7 +25,7 @@ use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyCar; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyTravel; use Doctrine\ORM\EntityManager; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Query\Expr; use Doctrine\ORM\Query\Expr\Andx; use Doctrine\ORM\Query\Expr\Join; @@ -43,7 +43,7 @@ class FilterEagerLoadingExtensionTest extends TestCase public function testIsNoForceEagerCollectionAttributes(): void { $em = $this->prophesize(EntityManager::class); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = $this->prophesize(QueryBuilder::class); $qb->getDQLPart('where')->shouldNotBeCalled(); @@ -58,7 +58,7 @@ public function testIsNoForceEagerCollectionAttributes(): void public function testIsForceEagerConfig(): void { $em = $this->prophesize(EntityManager::class); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = $this->prophesize(QueryBuilder::class); $qb->getDQLPart('where')->shouldNotBeCalled(); @@ -73,7 +73,7 @@ public function testIsForceEagerConfig(): void public function testHasNoWherePart(): void { $em = $this->prophesize(EntityManager::class); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = $this->prophesize(QueryBuilder::class); $qb->getDQLPart('where')->shouldBeCalled()->willReturn(null); @@ -88,7 +88,7 @@ public function testHasNoWherePart(): void public function testHasNoJoinPart(): void { $em = $this->prophesize(EntityManager::class); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = $this->prophesize(QueryBuilder::class); $qb->getDQLPart('where')->shouldBeCalled()->willReturn(new Andx()); @@ -106,7 +106,7 @@ public function testApplyCollection(): void { $em = $this->prophesize(EntityManager::class); $em->getExpressionBuilder()->shouldBeCalled()->willReturn(new Expr()); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = new QueryBuilder($em->reveal()); @@ -133,7 +133,7 @@ public function testApplyCollectionWithManualJoin(): void $em = $this->prophesize(EntityManager::class); $em->getExpressionBuilder()->shouldBeCalled()->willReturn(new Expr()); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = new QueryBuilder($em->reveal()); @@ -178,7 +178,7 @@ public function testApplyCollectionCorrectlyReplacesJoinCondition(): void $em = $this->prophesize(EntityManager::class); $em->getExpressionBuilder()->shouldBeCalled()->willReturn(new Expr()); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = new QueryBuilder($em->reveal()); @@ -218,7 +218,7 @@ public function testHiddenOrderBy(): void { $em = $this->prophesize(EntityManager::class); $em->getExpressionBuilder()->shouldBeCalled()->willReturn(new Expr()); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = new QueryBuilder($em->reveal()); @@ -253,7 +253,7 @@ public function testGroupBy(): void { $em = $this->prophesize(EntityManager::class); $em->getExpressionBuilder()->shouldBeCalled()->willReturn(new Expr()); - $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadataInfo(DummyCar::class)); + $em->getClassMetadata(DummyCar::class)->shouldBeCalled()->willReturn(new ClassMetadata(DummyCar::class)); $qb = new QueryBuilder($em->reveal()); @@ -290,9 +290,9 @@ public function testGroupBy(): void public function testCompositeIdentifiers(): void { - $classMetadataProphecy = $this->prophesize(ClassMetadataInfo::class); + $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->getIdentifier()->willReturn(['item', 'label']); - $classMetadataProphecy->getAssociationMappings()->willReturn(['item' => ['fetch' => ClassMetadataInfo::FETCH_EAGER]]); + $classMetadataProphecy->getAssociationMappings()->willReturn(['item' => ['fetch' => ClassMetadata::FETCH_EAGER]]); $classMetadataProphecy->hasAssociation('item')->shouldBeCalled()->willReturn(true); $classMetadataProphecy->hasAssociation('label')->shouldBeCalled()->willReturn(true); @@ -343,7 +343,7 @@ public function testCompositeIdentifiers(): void public function testFetchEagerWithNoForceEager(): void { - $classMetadata = new ClassMetadataInfo(CompositeRelation::class); + $classMetadata = new ClassMetadata(CompositeRelation::class); $classMetadata->isIdentifierComposite = true; $classMetadata->identifier = ['item', 'label']; // @phpstan-ignore-next-line @@ -414,9 +414,9 @@ public function testFetchEagerWithNoForceEager(): void public function testCompositeIdentifiersWithAssociation(): void { - $classMetadataProphecy = $this->prophesize(ClassMetadataInfo::class); + $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->getIdentifier()->willReturn(['item', 'label', 'bar']); - $classMetadataProphecy->getAssociationMappings()->willReturn(['item' => ['fetch' => ClassMetadataInfo::FETCH_EAGER]]); + $classMetadataProphecy->getAssociationMappings()->willReturn(['item' => ['fetch' => ClassMetadata::FETCH_EAGER]]); $classMetadataProphecy->hasAssociation('item')->shouldBeCalled()->willReturn(true); $classMetadataProphecy->hasAssociation('label')->shouldBeCalled()->willReturn(true); $classMetadataProphecy->hasAssociation('bar')->shouldBeCalled()->willReturn(false); @@ -469,9 +469,9 @@ public function testCompositeIdentifiersWithAssociation(): void public function testCompositeIdentifiersWithoutAssociation(): void { - $classMetadataProphecy = $this->prophesize(ClassMetadataInfo::class); + $classMetadataProphecy = $this->prophesize(ClassMetadata::class); $classMetadataProphecy->getIdentifier()->willReturn(['foo', 'bar']); - $classMetadataProphecy->getAssociationMappings()->willReturn(['item' => ['fetch' => ClassMetadataInfo::FETCH_EAGER]]); + $classMetadataProphecy->getAssociationMappings()->willReturn(['item' => ['fetch' => ClassMetadata::FETCH_EAGER]]); $classMetadataProphecy->hasAssociation('foo')->shouldBeCalled()->willReturn(false); $classMetadataProphecy->hasAssociation('bar')->shouldBeCalled()->willReturn(false); @@ -508,7 +508,7 @@ public function testCompositeIdentifiersWithoutAssociation(): void public function testCompositeIdentifiersWithForeignIdentifiers(): void { - $classMetadata = new ClassMetadataInfo(DummyCar::class); + $classMetadata = new ClassMetadata(DummyCar::class); $classMetadata->setIdentifier(['id']); $classMetadata->containsForeignIdentifier = true; diff --git a/tests/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactoryTest.php b/tests/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactoryTest.php index 33aa2abc66e..6f1ff2790b3 100644 --- a/tests/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactoryTest.php +++ b/tests/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactoryTest.php @@ -18,7 +18,7 @@ use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\Dummy; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\DummyPropertyWithDefaultValue; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ORM\Mapping\ClassMetadata as ORMClassMetadata; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\Mapping\ClassMetadata; use Doctrine\Persistence\ObjectManager; @@ -54,7 +54,7 @@ public function testCreateIsIdentifier(): void $propertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class); $propertyMetadataFactory->create(Dummy::class, 'id', [])->shouldBeCalled()->willReturn($propertyMetadata); - $classMetadata = $this->prophesize(ClassMetadataInfo::class); + $classMetadata = $this->prophesize(ClassMetadata::class); $objectManager = $this->prophesize(ObjectManager::class); $objectManager->getClassMetadata(Dummy::class)->shouldNotBeCalled()->willReturn($classMetadata->reveal()); @@ -75,7 +75,7 @@ public function testCreateIsWritable(): void $propertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class); $propertyMetadataFactory->create(Dummy::class, 'id', [])->shouldBeCalled()->willReturn($propertyMetadata); - $classMetadata = $this->prophesize(ClassMetadataInfo::class); + $classMetadata = $this->prophesize(ClassMetadata::class); $classMetadata->getIdentifier()->shouldBeCalled()->willReturn(['id']); $classMetadata->getFieldNames()->shouldBeCalled()->willReturn([]); @@ -100,7 +100,7 @@ public function testCreateWithDefaultOption(): void $propertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class); $propertyMetadataFactory->create(DummyPropertyWithDefaultValue::class, 'dummyDefaultOption', [])->shouldBeCalled()->willReturn($propertyMetadata); - $classMetadata = new ClassMetadataInfo(DummyPropertyWithDefaultValue::class); + $classMetadata = new ORMClassMetadata(DummyPropertyWithDefaultValue::class); // @phpstan-ignore-next-line $classMetadata->fieldMappings = [ 'dummyDefaultOption' => ['options' => ['default' => 'default value']], @@ -126,7 +126,7 @@ public function testCreateClassMetadataInfo(): void $propertyMetadataFactory = $this->prophesize(PropertyMetadataFactoryInterface::class); $propertyMetadataFactory->create(Dummy::class, 'id', [])->shouldBeCalled()->willReturn($propertyMetadata); - $classMetadata = $this->prophesize(ClassMetadataInfo::class); + $classMetadata = $this->prophesize(ClassMetadata::class); $classMetadata->getIdentifier()->shouldBeCalled()->willReturn(['id']); $classMetadata->isIdentifierNatural()->shouldBeCalled()->willReturn(true); $classMetadata->getFieldNames()->shouldBeCalled()->willReturn([]); diff --git a/tests/Doctrine/Orm/Metadata/Resource/DoctrineOrmLinkFactoryTest.php b/tests/Doctrine/Orm/Metadata/Resource/DoctrineOrmLinkFactoryTest.php index e7968e40653..afde43377bc 100644 --- a/tests/Doctrine/Orm/Metadata/Resource/DoctrineOrmLinkFactoryTest.php +++ b/tests/Doctrine/Orm/Metadata/Resource/DoctrineOrmLinkFactoryTest.php @@ -30,6 +30,7 @@ use Doctrine\Persistence\Mapping\ClassMetadata; use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; +use Doctrine\ORM\Mapping\InverseSideMapping; final class DoctrineOrmLinkFactoryTest extends TestCase { @@ -48,6 +49,7 @@ public function testCreateLinksFromRelations(): void $classMetadataProphecy->getAssociationTargetClass('relatedNonResource')->willReturn(Car::class); $classMetadataProphecy->getAssociationTargetClass('relatedDummy')->willReturn(RelatedDummy::class); $classMetadataProphecy->getAssociationTargetClass('relatedDummies')->willReturn(RelatedDummy::class); + $classMetadataProphecy->getAssociationTargetClass('noMappedBy')->willReturn('NoMappedByClass'); $classMetadataProphecy->getAssociationMappedByTargetField('relatedNonResource')->willReturn('dummies'); $classMetadataProphecy->getAssociationMappedByTargetField('relatedDummy')->willReturn(null); $classMetadataProphecy->getAssociationMappedByTargetField('relatedDummies')->willReturn('dummies'); @@ -72,6 +74,34 @@ public function testCreateLinksFromRelations(): void ), ], $doctrineOrmLinkFactory->createLinksFromRelations($operation)); } + + public function testCreateLinksFromRelationsDoctrine3(): void + { + if (!class_exists(InverseSideMapping::class)) { + $this->markTestSkipped(); + } + + $class = Dummy::class; + $operation = (new Get())->withClass($class); + + $classMetadataProphecy = $this->prophesize(ClassMetadata::class); + $classMetadataProphecy->hasAssociation('noMappedBy')->willReturn(true); + $classMetadataProphecy->getAssociationTargetClass('noMappedBy')->willReturn('NoMappedByClass'); + $classMetadataProphecy->getAssociationMappedByTargetField('noMappedBy')->shouldNotBeCalled(); + $entityManagerProphecy = $this->prophesize(EntityManagerInterface::class); + $entityManagerProphecy->getClassMetadata($class)->willReturn($classMetadataProphecy->reveal()); + $managerRegistryProphecy = $this->prophesize(ManagerRegistry::class); + $managerRegistryProphecy->getManagerForClass($class)->willReturn($entityManagerProphecy->reveal()); + $propertyNameCollectionFactoryProphecy = $this->prophesize(PropertyNameCollectionFactoryInterface::class); + $propertyNameCollectionFactoryProphecy->create($class)->willReturn(new PropertyNameCollection(['noMappedBy'])); + $resourceClassResolverProphecy = $this->prophesize(ResourceClassResolverInterface::class); + $resourceClassResolverProphecy->isResourceClass(Car::class)->shouldNotBeCalled(); + + $doctrineOrmLinkFactory = new DoctrineOrmLinkFactory($managerRegistryProphecy->reveal(), $propertyNameCollectionFactoryProphecy->reveal(), $resourceClassResolverProphecy->reveal(), new LinkFactoryStub()); + + self::assertEquals([ + ], $doctrineOrmLinkFactory->createLinksFromRelations($operation)); + } } class LinkFactoryStub implements LinkFactoryInterface, PropertyLinkFactoryInterface diff --git a/tests/Doctrine/Orm/State/ItemProviderTest.php b/tests/Doctrine/Orm/State/ItemProviderTest.php index 725fa11c244..7d3b7107308 100644 --- a/tests/Doctrine/Orm/State/ItemProviderTest.php +++ b/tests/Doctrine/Orm/State/ItemProviderTest.php @@ -33,7 +33,6 @@ use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Mapping\ClassMetadata; -use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ObjectRepository; @@ -255,7 +254,7 @@ public function testGetSubresourceFromProperty(): void $employeeClassMetadataProphecy = $this->prophesize(ClassMetadata::class); $employeeClassMetadataProphecy->getAssociationMapping('company')->willReturn([ - 'type' => ClassMetadataInfo::TO_ONE, + 'type' => ClassMetadata::TO_ONE, 'fieldName' => 'company', ]); $employeeClassMetadataProphecy->getTypeOfField('id')->willReturn(Types::INTEGER); diff --git a/tests/Fixtures/TestBundle/Doctrine/Generator/UuidGenerator.php b/tests/Fixtures/TestBundle/Doctrine/Generator/UuidGenerator.php index 3692dcd3e39..ff483a28671 100644 --- a/tests/Fixtures/TestBundle/Doctrine/Generator/UuidGenerator.php +++ b/tests/Fixtures/TestBundle/Doctrine/Generator/UuidGenerator.php @@ -14,11 +14,12 @@ namespace ApiPlatform\Tests\Fixtures\TestBundle\Doctrine\Generator; use Doctrine\ORM\EntityManager; +use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\Id\AbstractIdGenerator; class UuidGenerator extends AbstractIdGenerator { - public function generate(EntityManager $em, $entity): Uuid + public function generateId(EntityManagerInterface $em, ?object $entity): mixed { return new Uuid(); } diff --git a/tests/Fixtures/TestBundle/Doctrine/Orm/EntityManager.php b/tests/Fixtures/TestBundle/Doctrine/Orm/EntityManager.php index 1e66df65da3..4b6b5cdf62e 100644 --- a/tests/Fixtures/TestBundle/Doctrine/Orm/EntityManager.php +++ b/tests/Fixtures/TestBundle/Doctrine/Orm/EntityManager.php @@ -15,6 +15,7 @@ use Doctrine\ORM\Decorator\EntityManagerDecorator; use Doctrine\ORM\EntityManagerInterface; +use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\Repository\RepositoryFactory; @@ -29,7 +30,7 @@ public function __construct(EntityManagerInterface $wrapped, private readonly Re parent::__construct($wrapped); } - public function getRepository($className): ObjectRepository + public function getRepository($className): EntityRepository { return $this->repositoryFactory->getRepository($this, $className); } diff --git a/tests/Fixtures/TestBundle/State/OperationResourceProcessor.php b/tests/Fixtures/TestBundle/State/OperationResourceProcessor.php index 30fb8fc1467..0d0d8333643 100644 --- a/tests/Fixtures/TestBundle/State/OperationResourceProcessor.php +++ b/tests/Fixtures/TestBundle/State/OperationResourceProcessor.php @@ -17,8 +17,8 @@ use ApiPlatform\Metadata\Operation; use ApiPlatform\Metadata\Util\ClassInfoTrait; use ApiPlatform\State\ProcessorInterface; -use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; -use Doctrine\ORM\Mapping\ClassMetadataInfo; +use Doctrine\ODM\MongoDB\Mapping\ClassMetadata as ODMClassMetadata; +use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\ObjectManager as DoctrineObjectManager; @@ -81,7 +81,7 @@ private function getManager($data): ?DoctrineObjectManager private function isDeferredExplicit(DoctrineObjectManager $manager, $data): bool { $classMetadata = $manager->getClassMetadata($this->getObjectClass($data)); - if (($classMetadata instanceof ClassMetadataInfo || $classMetadata instanceof ClassMetadata) && method_exists($classMetadata, 'isChangeTrackingDeferredExplicit')) { + if (($classMetadata instanceof ClassMetadata || $classMetadata instanceof ODMClassMetadata) && method_exists($classMetadata, 'isChangeTrackingDeferredExplicit')) { return $classMetadata->isChangeTrackingDeferredExplicit(); }