From b1c1b2fcc58040472542827b5b142eb06cce6948 Mon Sep 17 00:00:00 2001 From: Valentin Date: Thu, 1 Jun 2017 23:44:40 +0300 Subject: [PATCH 1/7] Added support for Doctrine Embeddables "doctrine/orm": "^2.5" only --- .../PropertyInfo/DoctrineExtractor.php | 10 ++++++ .../PropertyInfo/DoctrineExtractorTest.php | 21 +++++++++++ .../Fixtures/DoctrineEmbeddable.php | 28 +++++++++++++++ .../Fixtures/DoctrineWithEmbedded.php | 36 +++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineEmbeddable.php create mode 100644 src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineWithEmbedded.php diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index aba31792f99ee..f6614a22eef19 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -105,6 +105,16 @@ public function getTypes($class, $property, array $context = array()) )); } + if (class_exists('Doctrine\ORM\Mapping\Embedded')) { + if ($metadata instanceof ClassMetadataInfo && isset($metadata->embeddedClasses[$property])) { + return array(new Type( + Type::BUILTIN_TYPE_OBJECT, + false, + $metadata->embeddedClasses[$property]['class'] + )); + } + } + if ($metadata->hasField($property)) { $typeOfField = $metadata->getTypeOfField($property); $nullable = $metadata instanceof ClassMetadataInfo && $metadata->isNullable($property); diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php index 2224517db6708..84147438f5c80 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php @@ -70,6 +70,27 @@ public function testExtract($property, array $type = null) $this->assertEquals($type, $this->extractor->getTypes('Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\DoctrineDummy', $property, array())); } + public function testExtractEmbeddable() + { + if (!class_exists('Doctrine\ORM\Mapping\Embedded')) { + return; + } + + $expectedTypes = [new Type( + Type::BUILTIN_TYPE_OBJECT, + false, + 'Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\DoctrineEmbeddable' + )]; + + $actualTypes = $this->extractor->getTypes( + 'Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\DoctrineWithEmbedded', + 'embedded', + array() + ); + + $this->assertEquals($expectedTypes, $actualTypes); + } + public function typesProvider() { return array( diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineEmbeddable.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineEmbeddable.php new file mode 100644 index 0000000000000..a00856ed7331e --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineEmbeddable.php @@ -0,0 +1,28 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures; + +use Doctrine\ORM\Mapping\Column; +use Doctrine\ORM\Mapping\Embeddable; + +/** + * @Embeddable + * + * @author Udaltsov Valentin + */ +class DoctrineEmbeddable +{ + /** + * @Column(type="string") + */ + protected $field; +} diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineWithEmbedded.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineWithEmbedded.php new file mode 100644 index 0000000000000..a1e011338f0b0 --- /dev/null +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/Fixtures/DoctrineWithEmbedded.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures; + +use Doctrine\ORM\Mapping\Column; +use Doctrine\ORM\Mapping\Entity; +use Doctrine\ORM\Mapping\Id; +use Doctrine\ORM\Mapping\Embedded; + +/** + * @Entity + * + * @author Udaltsov Valentin + */ +class DoctrineWithEmbedded +{ + /** + * @Id + * @Column(type="smallint") + */ + public $id; + + /** + * @Embedded(class="DoctrineEmbeddable") + */ + protected $embedded; +} From e1deefd1249fa2b16136996fbd4d19ae098be208 Mon Sep 17 00:00:00 2001 From: Valentin Date: Fri, 2 Jun 2017 00:06:12 +0300 Subject: [PATCH 2/7] Fixed array declaration --- .../Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php index 84147438f5c80..a2435b6d7c750 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php @@ -76,11 +76,11 @@ public function testExtractEmbeddable() return; } - $expectedTypes = [new Type( + $expectedTypes = array(new Type( Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\DoctrineEmbeddable' - )]; + )); $actualTypes = $this->extractor->getTypes( 'Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\DoctrineWithEmbedded', From 24201908a4fb4341129172b3aa3c4f3868cb4ced Mon Sep 17 00:00:00 2001 From: Valentin Date: Fri, 2 Jun 2017 00:41:06 +0300 Subject: [PATCH 3/7] Fixed getProperties() for embeddables --- .../Doctrine/PropertyInfo/DoctrineExtractor.php | 14 +++++++++++++- .../Tests/PropertyInfo/DoctrineExtractorTest.php | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index f6614a22eef19..0ee277ef4e4f9 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -50,7 +50,19 @@ public function getProperties($class, array $context = array()) return; } - return array_merge($metadata->getFieldNames(), $metadata->getAssociationNames()); + $properties = array_merge($metadata->getFieldNames(), $metadata->getAssociationNames()); + + if (class_exists('Doctrine\ORM\Mapping\Embedded')) { + if ($metadata instanceof ClassMetadataInfo && count($metadata->embeddedClasses) > 0) { + $properties = array_filter($properties, function ($property) { + return false === strpos($property, '.'); + }); + + $properties = array_merge($properties, array_keys($metadata->embeddedClasses)); + } + } + + return $properties; } /** diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php index a2435b6d7c750..5f6aa055fa029 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php @@ -62,6 +62,21 @@ public function testGetProperties() ); } + public function testGetEmbeddableProperties() + { + if (!class_exists('Doctrine\ORM\Mapping\Embedded')) { + return; + } + + $this->assertEquals( + array( + 'id', + 'embedded', + ), + $this->extractor->getProperties('Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\DoctrineWithEmbedded') + ); + } + /** * @dataProvider typesProvider */ From d572d53098272a4ec84a14652d63ca2685155c12 Mon Sep 17 00:00:00 2001 From: Valentin Date: Fri, 2 Jun 2017 12:27:59 +0300 Subject: [PATCH 4/7] Corrected test methods names and added markTestSkipped() --- .../Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php index 5f6aa055fa029..ecbfbbe32c865 100644 --- a/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php +++ b/src/Symfony/Bridge/Doctrine/Tests/PropertyInfo/DoctrineExtractorTest.php @@ -62,10 +62,10 @@ public function testGetProperties() ); } - public function testGetEmbeddableProperties() + public function testGetPropertiesWithEmbedded() { if (!class_exists('Doctrine\ORM\Mapping\Embedded')) { - return; + $this->markTestSkipped('@Embedded is not available in Doctrine ORM lower than 2.5.'); } $this->assertEquals( @@ -85,10 +85,10 @@ public function testExtract($property, array $type = null) $this->assertEquals($type, $this->extractor->getTypes('Symfony\Bridge\Doctrine\Tests\PropertyInfo\Fixtures\DoctrineDummy', $property, array())); } - public function testExtractEmbeddable() + public function testExtractWithEmbedded() { if (!class_exists('Doctrine\ORM\Mapping\Embedded')) { - return; + $this->markTestSkipped('@Embedded is not available in Doctrine ORM lower than 2.5.'); } $expectedTypes = array(new Type( From fff8330b92a7bc7566a43a994955bc8c34d6f663 Mon Sep 17 00:00:00 2001 From: Valentin Date: Fri, 30 Jun 2017 11:44:04 +0300 Subject: [PATCH 5/7] Improved ClassMetadataInfo::$embeddedClasses nonempty array check --- src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index 0ee277ef4e4f9..f1b2b0c3d1da6 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -53,7 +53,7 @@ public function getProperties($class, array $context = array()) $properties = array_merge($metadata->getFieldNames(), $metadata->getAssociationNames()); if (class_exists('Doctrine\ORM\Mapping\Embedded')) { - if ($metadata instanceof ClassMetadataInfo && count($metadata->embeddedClasses) > 0) { + if ($metadata instanceof ClassMetadataInfo && $metadata->embeddedClasses) { $properties = array_filter($properties, function ($property) { return false === strpos($property, '.'); }); From 42ffb1460269e5ed7481929137047acb997b0138 Mon Sep 17 00:00:00 2001 From: Valentin Date: Thu, 13 Jul 2017 22:18:30 +0300 Subject: [PATCH 6/7] Codestyle fix and if optimizations --- .../PropertyInfo/DoctrineExtractor.php | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index f1b2b0c3d1da6..d177f72d647e5 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -52,14 +52,12 @@ public function getProperties($class, array $context = array()) $properties = array_merge($metadata->getFieldNames(), $metadata->getAssociationNames()); - if (class_exists('Doctrine\ORM\Mapping\Embedded')) { - if ($metadata instanceof ClassMetadataInfo && $metadata->embeddedClasses) { - $properties = array_filter($properties, function ($property) { - return false === strpos($property, '.'); - }); + if (class_exists('Doctrine\ORM\Mapping\Embedded') && $metadata instanceof ClassMetadataInfo && $metadata->embeddedClasses) { + $properties = array_filter($properties, function ($property) { + return false === strpos($property, '.'); + }); - $properties = array_merge($properties, array_keys($metadata->embeddedClasses)); - } + $properties = array_merge($properties, array_keys($metadata->embeddedClasses)); } return $properties; @@ -117,14 +115,8 @@ public function getTypes($class, $property, array $context = array()) )); } - if (class_exists('Doctrine\ORM\Mapping\Embedded')) { - if ($metadata instanceof ClassMetadataInfo && isset($metadata->embeddedClasses[$property])) { - return array(new Type( - Type::BUILTIN_TYPE_OBJECT, - false, - $metadata->embeddedClasses[$property]['class'] - )); - } + if (class_exists('Doctrine\ORM\Mapping\Embedded') && $metadata instanceof ClassMetadataInfo && isset($metadata->embeddedClasses[$property])) { + return array(new Type(Type::BUILTIN_TYPE_OBJECT, false, $metadata->embeddedClasses[$property]['class'])); } if ($metadata->hasField($property)) { From 268f54554f957683a1584a1a2311ec28f4e5e9b4 Mon Sep 17 00:00:00 2001 From: Valentin Date: Sat, 22 Jul 2017 18:50:45 +0300 Subject: [PATCH 7/7] Performance improvements --- .../Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php index d177f72d647e5..200cc582d414a 100644 --- a/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php +++ b/src/Symfony/Bridge/Doctrine/PropertyInfo/DoctrineExtractor.php @@ -52,7 +52,7 @@ public function getProperties($class, array $context = array()) $properties = array_merge($metadata->getFieldNames(), $metadata->getAssociationNames()); - if (class_exists('Doctrine\ORM\Mapping\Embedded') && $metadata instanceof ClassMetadataInfo && $metadata->embeddedClasses) { + if ($metadata instanceof ClassMetadataInfo && class_exists('Doctrine\ORM\Mapping\Embedded') && $metadata->embeddedClasses) { $properties = array_filter($properties, function ($property) { return false === strpos($property, '.'); }); @@ -115,7 +115,7 @@ public function getTypes($class, $property, array $context = array()) )); } - if (class_exists('Doctrine\ORM\Mapping\Embedded') && $metadata instanceof ClassMetadataInfo && isset($metadata->embeddedClasses[$property])) { + if ($metadata instanceof ClassMetadataInfo && class_exists('Doctrine\ORM\Mapping\Embedded') && isset($metadata->embeddedClasses[$property])) { return array(new Type(Type::BUILTIN_TYPE_OBJECT, false, $metadata->embeddedClasses[$property]['class'])); }