From 5c48add92d6f804306e4c972ef435afb64041263 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Wed, 7 Nov 2018 11:44:40 +0100 Subject: [PATCH 1/5] Skip embedded fields in embeddables This change skips the creation of mapped fields inside embeddables. Consider the PHP Money class: ```php public class Invoice { /** * @var Money * * @ORM\Embedded(class="Money\Money") */ private $total; } ``` ```php final class Money implements \JsonSerializable { /** * @var Currency */ private $currency; } ``` Here, Money has the mapped field `Currency`. In doctrine Metadata, this is correctly reflected as `total.currency`. The EntityRegenerator declares a private field `$total.currency` afterwards. The changeset suppresses this behaviour by skipping fields containing a dot as is done a few lines below. --- src/Doctrine/EntityRegenerator.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Doctrine/EntityRegenerator.php b/src/Doctrine/EntityRegenerator.php index e64470219..567eaea50 100644 --- a/src/Doctrine/EntityRegenerator.php +++ b/src/Doctrine/EntityRegenerator.php @@ -76,6 +76,10 @@ public function regenerateEntities(string $classOrNamespace) $embeddedClasses = []; foreach ($classMetadata->embeddedClasses as $fieldName => $mapping) { + if (false !== strpos($fieldName, '.')) { + continue; + } + $className = $mapping['class']; $embeddedClasses[$fieldName] = $this->getPathOfClass($className); From 84e2f58e8a0b9e8e3f81a78b8ae83624344c96bc Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Sun, 3 Feb 2019 10:43:27 +0100 Subject: [PATCH 2/5] Add small test to embeddable test --- composer.json | 1 + tests/Maker/FunctionalTest.php | 12 +++++ .../src/Entity/Invoice.php | 28 +++++++++++ .../tests/GeneratedEntityTest.php | 50 +++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Invoice.php create mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/tests/GeneratedEntityTest.php diff --git a/composer.json b/composer.json index f4709deb7..f907f75f2 100644 --- a/composer.json +++ b/composer.json @@ -28,6 +28,7 @@ "doctrine/doctrine-bundle": "^1.8", "doctrine/orm": "^2.3", "friendsofphp/php-cs-fixer": "^2.8", + "moneyphp/money": "^3.2", "symfony/phpunit-bridge": "^3.4|^4.0", "symfony/process": "^3.4|^4.0", "symfony/yaml": "^3.4|^4.0" diff --git a/tests/Maker/FunctionalTest.php b/tests/Maker/FunctionalTest.php index 7b709353c..9007cb05d 100644 --- a/tests/Maker/FunctionalTest.php +++ b/tests/Maker/FunctionalTest.php @@ -1136,6 +1136,18 @@ public function getCommandEntityTests() ->setRequiredPhpVersion(70100) ]; + yield 'entity_regenerate_embeddable_object' => [MakerTestDetails::createTest( + $this->getMakerInstance(MakeEntity::class), + [ + // namespace: use default App\Entity + '', + ]) + ->setArgumentsString('--regenerate') + ->setFixtureFilesPath(__DIR__.'/../fixtures/MakeEntityRegenerateEmbeddableObject') + ->configureDatabase() + ->setRequiredPhpVersion(70100) + ]; + yield 'entity_regenerate_embeddable' => [MakerTestDetails::createTest( $this->getMakerInstance(MakeEntity::class), [ diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Invoice.php b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Invoice.php new file mode 100644 index 000000000..4af40885c --- /dev/null +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Invoice.php @@ -0,0 +1,28 @@ +getContainer() + ->get('doctrine') + ->getManager(); + + $em->createQuery('DELETE FROM App\\Entity\\Invoice i')->execute(); + + $invoice = new Invoice(); + // check that the constructor was instantiated properly + $this->assertInstanceOf(Money::class, $invoice->getTotal()); + // fields should now have setters + $invoice->setTitle('Borscht'); + + $total = new Money(100, new Currency('EUR')); + $invoice->setTotal($total); + + $em->persist($invoice); + + $em->flush(); + $em->refresh($invoice); + + /** @var Invoice[] $actualInvoice */ + $actualInvoice = $em->getRepository(Invoice::class) + ->findAll(); + + $this->assertcount(1, $actualInvoice); + + /** @var Money $actualTotal */ + $actualTotal = $actualInvoice[0]->getTotal(); + + $this->assertInstanceOf(Money::class, $actualTotal); + } +} From 6b9f7d85f90bb278472eb97a21c477b0380a9fca Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Sun, 3 Feb 2019 11:07:20 +0100 Subject: [PATCH 3/5] Map embeddable money test with XML for convenience --- tests/Maker/FunctionalTest.php | 10 ++++++++++ .../config/doctrine/Currency.orm.xml | 13 +++++++++++++ .../config/doctrine/Invoice.orm.xml | 15 +++++++++++++++ .../config/doctrine/Money.orm.xml | 10 ++++++++++ .../tests/GeneratedEntityTest.php | 2 -- 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Currency.orm.xml create mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml create mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Money.orm.xml diff --git a/tests/Maker/FunctionalTest.php b/tests/Maker/FunctionalTest.php index 9007cb05d..165523d0b 100644 --- a/tests/Maker/FunctionalTest.php +++ b/tests/Maker/FunctionalTest.php @@ -1144,6 +1144,16 @@ public function getCommandEntityTests() ]) ->setArgumentsString('--regenerate') ->setFixtureFilesPath(__DIR__.'/../fixtures/MakeEntityRegenerateEmbeddableObject') + ->addReplacement( + 'config/packages/doctrine.yaml', + 'type: annotation', + 'type: xml' + ) + ->addReplacement( + 'config/packages/doctrine.yaml', + "dir: '%kernel.project_dir%/src/Entity'", + "dir: '%kernel.project_dir%/config/doctrine'" + ) ->configureDatabase() ->setRequiredPhpVersion(70100) ]; diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Currency.orm.xml b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Currency.orm.xml new file mode 100644 index 000000000..80ec86dca --- /dev/null +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Currency.orm.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml new file mode 100644 index 000000000..cebaf593b --- /dev/null +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Money.orm.xml b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Money.orm.xml new file mode 100644 index 000000000..282bc98ae --- /dev/null +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Money.orm.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/tests/GeneratedEntityTest.php b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/tests/GeneratedEntityTest.php index c75528904..81a65ae2d 100644 --- a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/tests/GeneratedEntityTest.php +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/tests/GeneratedEntityTest.php @@ -7,8 +7,6 @@ use Money\Money; use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase; use Doctrine\ORM\EntityManager; -use App\Entity\Food; -use App\Entity\Recipe; class GeneratedEntityTest extends KernelTestCase { From 074f836e0189ea96a95a15ce5b897305f3f4d1ea Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Sun, 3 Feb 2019 11:20:07 +0100 Subject: [PATCH 4/5] Remove double slash --- .../config/doctrine/Invoice.orm.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml index cebaf593b..1583554e8 100644 --- a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml @@ -10,6 +10,6 @@ - + From a4d4787e272d3897aa04773ab1dc54c7ff8601a6 Mon Sep 17 00:00:00 2001 From: Cedric Ziel Date: Sun, 3 Feb 2019 13:02:01 +0100 Subject: [PATCH 5/5] Embed money objects --- composer.json | 1 - tests/Maker/FunctionalTest.php | 10 ----- .../config/doctrine/Currency.orm.xml | 13 ------ .../config/doctrine/Invoice.orm.xml | 15 ------- .../config/doctrine/Money.orm.xml | 10 ----- .../src/Entity/Currency.php | 43 +++++++++++++++++++ .../src/Entity/Invoice.php | 2 +- .../src/Entity/Money.php | 28 ++++++++++++ 8 files changed, 72 insertions(+), 50 deletions(-) delete mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Currency.orm.xml delete mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml delete mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Money.orm.xml create mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Currency.php create mode 100644 tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Money.php diff --git a/composer.json b/composer.json index f907f75f2..f4709deb7 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,6 @@ "doctrine/doctrine-bundle": "^1.8", "doctrine/orm": "^2.3", "friendsofphp/php-cs-fixer": "^2.8", - "moneyphp/money": "^3.2", "symfony/phpunit-bridge": "^3.4|^4.0", "symfony/process": "^3.4|^4.0", "symfony/yaml": "^3.4|^4.0" diff --git a/tests/Maker/FunctionalTest.php b/tests/Maker/FunctionalTest.php index 165523d0b..9007cb05d 100644 --- a/tests/Maker/FunctionalTest.php +++ b/tests/Maker/FunctionalTest.php @@ -1144,16 +1144,6 @@ public function getCommandEntityTests() ]) ->setArgumentsString('--regenerate') ->setFixtureFilesPath(__DIR__.'/../fixtures/MakeEntityRegenerateEmbeddableObject') - ->addReplacement( - 'config/packages/doctrine.yaml', - 'type: annotation', - 'type: xml' - ) - ->addReplacement( - 'config/packages/doctrine.yaml', - "dir: '%kernel.project_dir%/src/Entity'", - "dir: '%kernel.project_dir%/config/doctrine'" - ) ->configureDatabase() ->setRequiredPhpVersion(70100) ]; diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Currency.orm.xml b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Currency.orm.xml deleted file mode 100644 index 80ec86dca..000000000 --- a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Currency.orm.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml deleted file mode 100644 index 1583554e8..000000000 --- a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Invoice.orm.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Money.orm.xml b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Money.orm.xml deleted file mode 100644 index 282bc98ae..000000000 --- a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/config/doctrine/Money.orm.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Currency.php b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Currency.php new file mode 100644 index 000000000..d10d1bf5b --- /dev/null +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Currency.php @@ -0,0 +1,43 @@ +currency = $currency; + } + + /** + * @return string + */ + public function getCurrency() + { + return $this->currency; + } + + /** + * @param string $currency + * @return Currency + */ + public function setCurrency($currency) + { + $this->currency = $currency; + return $this; + } + + +} diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Invoice.php b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Invoice.php index 4af40885c..68ce7ae68 100644 --- a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Invoice.php +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Invoice.php @@ -22,7 +22,7 @@ class Invoice private $title; /** - * @ORM\Embedded(class="Money\Money") + * @ORM\Embedded(class="App\Entity\Money") */ private $total; } diff --git a/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Money.php b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Money.php new file mode 100644 index 000000000..9f19cf7f0 --- /dev/null +++ b/tests/fixtures/MakeEntityRegenerateEmbeddableObject/src/Entity/Money.php @@ -0,0 +1,28 @@ +amount = $amount; + $this->currency = $currency; + } +}