diff --git a/CHANGELOG.md b/CHANGELOG.md index 7375e30135..8eb668c10b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ a release. ## [Unreleased] ### Changed - Add conflict with "doctrine/orm" >=2.16 (temporary change until code is fixed) +### Fixed +- References: fixed condition in `XML` Driver that did not allow to retrieve from the entity definition the `mappedBy` and `inversedBy` fields. ## [3.12.0] - 2023-07-08 ### Added diff --git a/schemas/orm/doctrine-extensions-mapping-2-2.xsd b/schemas/orm/doctrine-extensions-mapping-2-2.xsd index 34ce2a37ed..71f30049a1 100644 --- a/schemas/orm/doctrine-extensions-mapping-2-2.xsd +++ b/schemas/orm/doctrine-extensions-mapping-2-2.xsd @@ -29,6 +29,7 @@ + @@ -65,6 +66,7 @@ + diff --git a/src/References/Mapping/Driver/Xml.php b/src/References/Mapping/Driver/Xml.php index 9a7b0c774d..8f5bd0954a 100644 --- a/src/References/Mapping/Driver/Xml.php +++ b/src/References/Mapping/Driver/Xml.php @@ -93,10 +93,10 @@ public function readExtendedMetadata($meta, array &$config) 'identifier' => $identifier, ]; - if (!$this->_isAttributeSet($element, 'mappedBy')) { + if ($this->_isAttributeSet($element, 'mappedBy')) { $config[$reference][$field]['mappedBy'] = $this->_getAttribute($element, 'mappedBy'); } - if (!$this->_isAttributeSet($element, 'inversedBy')) { + if ($this->_isAttributeSet($element, 'inversedBy')) { $config[$reference][$field]['inversedBy'] = $this->_getAttribute($element, 'inversedBy'); } } diff --git a/tests/Gedmo/Mapping/Driver/Xml/Gedmo.Tests.Mapping.Fixture.Xml.References.dcm.xml b/tests/Gedmo/Mapping/Driver/Xml/Gedmo.Tests.Mapping.Fixture.Xml.References.dcm.xml new file mode 100644 index 0000000000..32c8e2c6a9 --- /dev/null +++ b/tests/Gedmo/Mapping/Driver/Xml/Gedmo.Tests.Mapping.Fixture.Xml.References.dcm.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/tests/Gedmo/Mapping/Fixture/Xml/References.php b/tests/Gedmo/Mapping/Fixture/Xml/References.php new file mode 100644 index 0000000000..d18e62393c --- /dev/null +++ b/tests/Gedmo/Mapping/Fixture/Xml/References.php @@ -0,0 +1,32 @@ + http://www.gediminasm.org + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Gedmo\Tests\Mapping\Fixture\Xml; + +use Gedmo\Tests\Mapping\Fixture\Document\User; + +class References +{ + /** + * @var int + */ + private $id; + + /** + * @var string + */ + private $name; + + /** + * @var User[] + */ + private $users; +} diff --git a/tests/Gedmo/Mapping/Xml/ReferencesMappingTest.php b/tests/Gedmo/Mapping/Xml/ReferencesMappingTest.php new file mode 100644 index 0000000000..29590c099a --- /dev/null +++ b/tests/Gedmo/Mapping/Xml/ReferencesMappingTest.php @@ -0,0 +1,80 @@ + http://www.gediminasm.org + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Gedmo\Tests\Mapping\Xml; + +use Doctrine\Common\Annotations\AnnotationReader; +use Doctrine\Common\EventManager; +use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Mapping\Driver\AnnotationDriver; +use Doctrine\ORM\Mapping\Driver\XmlDriver; +use Doctrine\Persistence\Mapping\Driver\MappingDriverChain; +use Gedmo\References\ReferencesListener; +use Gedmo\Tests\Mapping\Fixture\Xml\References; +use Gedmo\Tests\Tool\BaseTestCaseOM; + +/** + * @author Guillermo Fuentes + */ +final class ReferencesMappingTest extends BaseTestCaseOM +{ + /** + * @var EntityManager + */ + private $em; + + /** + * @var ReferencesListener + */ + private $referencesListener; + + protected function setUp(): void + { + parent::setUp(); + + $reader = new AnnotationReader(); + $annotationDriver = new AnnotationDriver($reader); + + $xmlDriver = new XmlDriver(__DIR__.'/../Driver/Xml'); + + $chain = new MappingDriverChain(); + $chain->addDriver($xmlDriver, 'Gedmo\Tests\Mapping\Fixture\Xml'); + $chain->addDriver($annotationDriver, 'Gedmo\Tests\Mapping\Fixture'); + + $this->referencesListener = new ReferencesListener(); + $this->evm = new EventManager(); + $this->evm->addEventSubscriber($this->referencesListener); + + $this->em = $this->getDefaultMockSqliteEntityManager([ + References::class, + ], $chain); + } + + public function testMetadata(): void + { + $meta = $this->em->getClassMetadata(References::class); + $config = $this->referencesListener->getConfiguration($this->em, $meta->getName()); + + static::assertArrayHasKey('referenceMany', $config); + static::assertArrayHasKey('useObjectClass', $config); + static::assertSame(References::class, $config['useObjectClass']); + $configInternal = $config['referenceMany']; + static::assertArrayHasKey('users', $configInternal); + $configUsers = $configInternal['users']; + static::assertArrayHasKey('field', $configUsers); + static::assertArrayHasKey('type', $configUsers); + static::assertSame('document', $configUsers['type']); + static::assertArrayHasKey('class', $configUsers); + static::assertArrayHasKey('identifier', $configUsers); + static::assertArrayHasKey('mappedBy', $configUsers); + static::assertSame('reference', $configUsers['mappedBy']); + } +}