From e390dbd5baba9726af3ff48d63832ecbb500360e Mon Sep 17 00:00:00 2001 From: oprokidnev Date: Fri, 27 Nov 2015 16:00:56 +0500 Subject: [PATCH 1/2] Target entity resolver for DQL Since we have target entity resolver in doctrine this class check is not enought. To gain interface resolution it is better to add interface check in addition to class_check here. --- lib/Doctrine/ORM/Query/Parser.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/Doctrine/ORM/Query/Parser.php b/lib/Doctrine/ORM/Query/Parser.php index 6eb897268..8b6feaf83 100644 --- a/lib/Doctrine/ORM/Query/Parser.php +++ b/lib/Doctrine/ORM/Query/Parser.php @@ -996,9 +996,7 @@ class Parser */ private function validateAbstractSchemaName($schemaName) { - $exists = class_exists($schemaName, true); - - if (! $exists) { + if (! (class_exists($schemaName, true) || interface_exists($schemaName, true))) { $this->semanticalError("Class '$schemaName' is not defined.", $this->lexer->token); } } @@ -1814,7 +1812,7 @@ class Parser $this->match(Lexer::T_OPEN_CURLY_BRACE); $this->match(Lexer::T_IDENTIFIER); - $field = $this->lexer->token['value']; + $field = $this->lexer->token['value']; // First field in partial expression might be embeddable property while ($this->lexer->isNextToken(Lexer::T_DOT)) { From 0c6b510c2a80861452cf1c9e0a6e6a13f714a2c9 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Fri, 11 Dec 2015 21:30:19 +0100 Subject: [PATCH 2/2] #1572 - test coverage - interfaces should also resolve to target entities when in DQL --- .../Tools/ResolveTargetEntityListenerTest.php | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/tests/Doctrine/Tests/ORM/Tools/ResolveTargetEntityListenerTest.php b/tests/Doctrine/Tests/ORM/Tools/ResolveTargetEntityListenerTest.php index fdee6e8c2..2934693f8 100644 --- a/tests/Doctrine/Tests/ORM/Tools/ResolveTargetEntityListenerTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/ResolveTargetEntityListenerTest.php @@ -9,19 +9,19 @@ use Doctrine\ORM\Events; class ResolveTargetEntityListenerTest extends \Doctrine\Tests\OrmTestCase { /** - * @var EntityManager + * @var \Doctrine\ORM\EntityManager */ - private $em = null; + private $em; /** * @var ResolveTargetEntityListener */ - private $listener = null; + private $listener; /** * @var ClassMetadataFactory */ - private $factory = null; + private $factory; public function setUp() { @@ -106,6 +106,32 @@ class ResolveTargetEntityListenerTest extends \Doctrine\Tests\OrmTestCase $this->assertSame('Doctrine\Tests\ORM\Tools\TargetEntity', $meta['targetEntity']); $this->assertEquals(array('resolvetargetentity_id', 'targetinterface_id'), $meta['joinTableColumns']); } + + /** + * @group 1572 + * @group functional + * + * @coversNothing + */ + public function testDoesResolveTargetEntitiesInDQLAlsoWithInterfaces() + { + $evm = $this->em->getEventManager(); + $this->listener->addResolveTargetEntity( + 'Doctrine\Tests\ORM\Tools\ResolveTargetInterface', + 'Doctrine\Tests\ORM\Tools\ResolveTargetEntity', + array() + ); + + $evm->addEventSubscriber($this->listener); + + $this->assertStringMatchesFormat( + 'SELECT%AFROM ResolveTargetEntity%A', + $this + ->em + ->createQuery('SELECT f FROM Doctrine\Tests\ORM\Tools\ResolveTargetInterface f') + ->getSQL() + ); + } } interface ResolveTargetInterface