From 56fe02512c8617eb4be5e8b914545f948bb6ce0f Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Mon, 3 Jun 2019 14:24:16 +0200 Subject: [PATCH] don't add embedded properties to wrapping class metadata --- .../Tests/Fixtures/DoctrineLoaderEmbed.php | 25 +++++++++++++++++++ .../Tests/Fixtures/DoctrineLoaderEntity.php | 5 ++++ .../Tests/Validator/DoctrineLoaderTest.php | 19 +++++++++++++- .../Doctrine/Validator/DoctrineLoader.php | 7 +++++- 4 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderEmbed.php diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderEmbed.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderEmbed.php new file mode 100644 index 0000000000..7985b9c4c6 --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderEmbed.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Doctrine\Tests\Fixtures; + +use Doctrine\ORM\Mapping as ORM; + +/** + * @ORM\Embeddable + */ +class DoctrineLoaderEmbed +{ + /** + * @ORM\Column(length=25) + */ + public $embeddedMaxLength; +} diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderEntity.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderEntity.php index 4a92edec8f..1f403cb1f8 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderEntity.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/DoctrineLoaderEntity.php @@ -55,4 +55,9 @@ class DoctrineLoaderEntity * @ORM\Column(unique=true) */ public $alreadyMappedUnique; + + /** + * @ORM\Embedded(class=DoctrineLoaderEmbed::class) + */ + public $embedded; } diff --git a/src/Symfony/Bridge/Doctrine/Tests/Validator/DoctrineLoaderTest.php b/src/Symfony/Bridge/Doctrine/Tests/Validator/DoctrineLoaderTest.php index 63fd66eadd..3e94da9065 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/Validator/DoctrineLoaderTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/Validator/DoctrineLoaderTest.php @@ -14,11 +14,14 @@ namespace Symfony\Bridge\Doctrine\Tests\Validator; use PHPUnit\Framework\TestCase; use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper; use Symfony\Bridge\Doctrine\Tests\Fixtures\BaseUser; +use Symfony\Bridge\Doctrine\Tests\Fixtures\DoctrineLoaderEmbed; use Symfony\Bridge\Doctrine\Tests\Fixtures\DoctrineLoaderEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\DoctrineLoader; use Symfony\Component\Validator\Constraints\Length; +use Symfony\Component\Validator\Mapping\CascadingStrategy; use Symfony\Component\Validator\Mapping\ClassMetadata; +use Symfony\Component\Validator\Mapping\TraversalStrategy; use Symfony\Component\Validator\Tests\Fixtures\Entity; use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\ValidatorBuilder; @@ -36,7 +39,7 @@ class DoctrineLoaderTest extends TestCase $validator = Validation::createValidatorBuilder() ->enableAnnotationMapping() - ->addLoader(new DoctrineLoader(DoctrineTestHelper::createTestEntityManager(), '{^Symfony\\\\Bridge\\\\Doctrine\\\\Tests\\\\Fixtures\\\\DoctrineLoaderEntity$}')) + ->addLoader(new DoctrineLoader(DoctrineTestHelper::createTestEntityManager(), '{^Symfony\\\\Bridge\\\\Doctrine\\\\Tests\\\\Fixtures\\\\DoctrineLoader}')) ->getValidator() ; @@ -71,6 +74,20 @@ class DoctrineLoaderTest extends TestCase $this->assertInstanceOf(Length::class, $alreadyMappedMaxLengthConstraints[0]); $this->assertSame(10, $alreadyMappedMaxLengthConstraints[0]->max); $this->assertSame(1, $alreadyMappedMaxLengthConstraints[0]->min); + + $embeddedMetadata = $classMetadata->getPropertyMetadata('embedded'); + $this->assertCount(1, $embeddedMetadata); + $this->assertSame(CascadingStrategy::CASCADE, $embeddedMetadata[0]->getCascadingStrategy()); + $this->assertSame(TraversalStrategy::IMPLICIT, $embeddedMetadata[0]->getTraversalStrategy()); + + $embeddedClassMetadata = $validator->getMetadataFor(new DoctrineLoaderEmbed()); + + $embeddedMaxLengthMetadata = $embeddedClassMetadata->getPropertyMetadata('embeddedMaxLength'); + $this->assertCount(1, $embeddedMaxLengthMetadata); + $embeddedMaxLengthConstraints = $embeddedMaxLengthMetadata[0]->getConstraints(); + $this->assertCount(1, $embeddedMaxLengthConstraints); + $this->assertInstanceOf(Length::class, $embeddedMaxLengthConstraints[0]); + $this->assertSame(25, $embeddedMaxLengthConstraints[0]->max); } public function testFieldMappingsConfiguration() diff --git a/src/Symfony/Bridge/Doctrine/Validator/DoctrineLoader.php b/src/Symfony/Bridge/Doctrine/Validator/DoctrineLoader.php index 9e3c32aa62..111733c1d5 100644 --- a/src/Symfony/Bridge/Doctrine/Validator/DoctrineLoader.php +++ b/src/Symfony/Bridge/Doctrine/Validator/DoctrineLoader.php @@ -17,6 +17,7 @@ use Doctrine\ORM\Mapping\ClassMetadataInfo; use Doctrine\ORM\Mapping\MappingException as OrmMappingException; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Validator\Constraints\Length; +use Symfony\Component\Validator\Constraints\Valid; use Symfony\Component\Validator\Mapping\ClassMetadata; use Symfony\Component\Validator\Mapping\Loader\LoaderInterface; @@ -78,7 +79,11 @@ final class DoctrineLoader implements LoaderInterface $constraint = $this->getLengthConstraint($metadata, $mapping['fieldName']); if (null === $constraint) { - $metadata->addPropertyConstraint($mapping['fieldName'], new Length(['max' => $mapping['length']])); + if (isset($mapping['originalClass'])) { + $metadata->addPropertyConstraint($mapping['declaredField'], new Valid()); + } else { + $metadata->addPropertyConstraint($mapping['fieldName'], new Length(['max' => $mapping['length']])); + } } elseif (null === $constraint->max) { // If a Length constraint exists and no max length has been explicitly defined, set it $constraint->max = $mapping['length'];