diff --git a/src/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php b/src/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php index a22e6eb6423..a7b1932cda5 100644 --- a/src/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php +++ b/src/Doctrine/Orm/Metadata/Property/DoctrineOrmPropertyMetadataFactory.php @@ -75,7 +75,8 @@ public function create(string $resourceClass, string $property, array $options = if ($doctrineClassMetadata instanceof ClassMetadata && \in_array($property, $doctrineClassMetadata->getFieldNames(), true)) { $fieldMapping = $doctrineClassMetadata->getFieldMapping($property); if (class_exists(FieldMapping::class)) { - $propertyMetadata = $propertyMetadata->withDefault($fieldMapping->default ?? $propertyMetadata->getDefault()); + // TODO: remove the $fieldMapping->default fallback with doctrine/orm 4.0 (deprecated since 3.6, removed in 4.0) + $propertyMetadata = $propertyMetadata->withDefault($fieldMapping->options['default'] ?? $fieldMapping->default ?? $propertyMetadata->getDefault()); } else { $propertyMetadata = $propertyMetadata->withDefault($fieldMapping['options']['default'] ?? $propertyMetadata->getDefault()); } diff --git a/src/Doctrine/Orm/Tests/Metadata/Property/DoctrineOrmPropertyMetadataFactoryTest.php b/src/Doctrine/Orm/Tests/Metadata/Property/DoctrineOrmPropertyMetadataFactoryTest.php index a6ea25c8d6b..bbd1e3e0a59 100644 --- a/src/Doctrine/Orm/Tests/Metadata/Property/DoctrineOrmPropertyMetadataFactoryTest.php +++ b/src/Doctrine/Orm/Tests/Metadata/Property/DoctrineOrmPropertyMetadataFactoryTest.php @@ -19,9 +19,11 @@ use ApiPlatform\Metadata\ApiProperty; use ApiPlatform\Metadata\Property\Factory\PropertyMetadataFactoryInterface; use Doctrine\ORM\Mapping\ClassMetadata as ORMClassMetadata; +use Doctrine\ORM\Mapping\Driver\AttributeDriver; use Doctrine\ORM\Mapping\FieldMapping; use Doctrine\Persistence\ManagerRegistry; use Doctrine\Persistence\Mapping\ClassMetadata; +use Doctrine\Persistence\Mapping\RuntimeReflectionService; use Doctrine\Persistence\ObjectManager; use PHPUnit\Framework\TestCase; use Prophecy\PhpUnit\ProphecyTrait; @@ -106,6 +108,7 @@ public function testCreateWithDefaultOption(): void $classMetadata->getFieldNames()->shouldBeCalled()->willReturn(['dummyDefaultOption']); if (class_exists(FieldMapping::class)) { $fieldMapping = new FieldMapping('string', 'dummyDefaultOption', 'dummyDefaultOption'); + // TODO: FieldMapping::$default is removed in doctrine/orm 4.0, use $fieldMapping->options = ['default' => 'default value'] instead $fieldMapping->default = 'default value'; $classMetadata->fieldMappings = [$fieldMapping]; $classMetadata->getFieldMapping('dummyDefaultOption')->willReturn($fieldMapping); @@ -126,6 +129,26 @@ public function testCreateWithDefaultOption(): void $this->assertSame($doctrinePropertyMetadata->getDefault(), 'default value'); } + public function testCreateWithDefaultOptionFromColumnAttribute(): void + { + $classMetadata = new ORMClassMetadata(DummyPropertyWithDefaultValue::class); + $classMetadata->initializeReflection(new RuntimeReflectionService()); + (new AttributeDriver([]))->loadMetadataForClass(DummyPropertyWithDefaultValue::class, $classMetadata); + + $propertyMetadataFactory = $this->createStub(PropertyMetadataFactoryInterface::class); + $propertyMetadataFactory->method('create')->willReturn(new ApiProperty()); + + $objectManager = $this->createStub(ObjectManager::class); + $objectManager->method('getClassMetadata')->willReturn($classMetadata); + + $managerRegistry = $this->createStub(ManagerRegistry::class); + $managerRegistry->method('getManagerForClass')->willReturn($objectManager); + + $doctrineOrmPropertyMetadataFactory = new DoctrineOrmPropertyMetadataFactory($managerRegistry, $propertyMetadataFactory); + + $this->assertSame('default value', $doctrineOrmPropertyMetadataFactory->create(DummyPropertyWithDefaultValue::class, 'dummyDefaultOption')->getDefault()); + } + public function testCreateClassMetadataInfo(): void { $propertyMetadata = new ApiProperty();