From 752d4f9eac0c5a991f3114852d2414c123128a5b 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/Query/Parser.php b/lib/Doctrine/ORM/Query/Parser.php index 442dbac80..695e7ed10 100644 --- a/lib/Doctrine/ORM/Query/Parser.php +++ b/lib/Doctrine/ORM/Query/Parser.php @@ -965,7 +965,7 @@ class Parser $schemaName = $this->em->getConfiguration()->getEntityNamespace($namespaceAlias) . '\\' . $simpleClassName; } - $exists = class_exists($schemaName, true); + $exists = class_exists($schemaName, true) || interface_exists($schemaName, true); if ( ! $exists) { $this->semanticalError("Class '$schemaName' is not defined.", $this->lexer->token); From aa61328e9024f327dc65768bd9eaddff550dd1ca 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