From c059de9e601fa7a6985e274a49d323f583a918bf Mon Sep 17 00:00:00 2001 From: Jan Kramer Date: Tue, 24 Feb 2015 17:39:11 +0100 Subject: [PATCH 1/2] Implement test to show nested embeddables are not instantiated properly --- .../ORM/Functional/Ticket/DDC3582Test.php | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3582Test.php diff --git a/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3582Test.php b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3582Test.php new file mode 100644 index 000000000..4c07046f6 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/Ticket/DDC3582Test.php @@ -0,0 +1,70 @@ +_schemaTool->createSchema([$this->_em->getClassMetadata(DDC3582Entity::CLASSNAME)]); + $this->_em->persist(new DDC3582Entity('foo')); + $this->_em->flush(); + $this->_em->clear(); + + /** @var DDC3582Entity $entity */ + $entity = $this->_em->find(DDC3582Entity::CLASSNAME, 'foo'); + + $this->assertInstanceOf(DDC3582Embeddable1::CLASSNAME, $entity->embeddable1); + $this->assertInstanceOf(DDC3582Embeddable2::CLASSNAME, $entity->embeddable1->embeddable2); + $this->assertInstanceOf(DDC3582Embeddable3::CLASSNAME, $entity->embeddable1->embeddable2->embeddable3); + } +} + +/** @Entity */ +class DDC3582Entity +{ + const CLASSNAME = __CLASS__; + + /** @Column @Id */ + private $id; + + /** @Embedded(class="DDC3582Embeddable1") @var DDC3582Embeddable1 */ + public $embeddable1; + + public function __construct($id) + { + $this->id = $id; + $this->embeddable1 = new DDC3582Embeddable1(); + } +} + +/** @Embeddable */ +class DDC3582Embeddable1 +{ + const CLASSNAME = __CLASS__; + + /** @Embedded(class="DDC3582Embeddable2") @var DDC3582Embeddable2 */ + public $embeddable2; + + public function __construct() { $this->embeddable2 = new DDC3582Embeddable2(); } +} + +/** @Embeddable */ +class DDC3582Embeddable2 +{ + const CLASSNAME = __CLASS__; + + /** @Embedded(class="DDC3582Embeddable3") @var DDC3582Embeddable3 */ + public $embeddable3; + + public function __construct() { $this->embeddable3 = new DDC3582Embeddable3(); } +} + +/** @Embeddable */ +class DDC3582Embeddable3 +{ + const CLASSNAME = __CLASS__; + + /** @Column */ + public $embeddedValue = 'foo'; +} From f09b9895b675fadc46a8941bb3012a08b495b503 Mon Sep 17 00:00:00 2001 From: Jan Kramer Date: Fri, 27 Feb 2015 15:09:58 +0100 Subject: [PATCH 2/2] Fix embeddable instantiation in nested situations --- lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index ad418418a..75760abf4 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -934,7 +934,7 @@ class ClassMetadataInfo implements ClassMetadata $this->embeddedClasses[$embeddedClass['declaredField']]['class'], $embeddedClass['originalField'] ), - $embeddedClass['class'] + $this->embeddedClasses[$embeddedClass['declaredField']]['class'] ); continue;