From 437f81271862cf1edde863c32ed471c08357a482 Mon Sep 17 00:00:00 2001 From: Bart van den Burg Date: Wed, 4 Jul 2012 22:39:08 +0200 Subject: [PATCH] Added new event to allow actions to be done before trying to load class metadata --- .../Event/PreLoadClassMetadataEventArgs.php | 75 +++++++++++++++++++ lib/Doctrine/ORM/Events.php | 7 ++ .../ORM/Tools/ResolveTargetEntityListener.php | 19 ++++- .../Tools/ResolveTargetEntityListenerTest.php | 5 +- 4 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 lib/Doctrine/ORM/Event/PreLoadClassMetadataEventArgs.php diff --git a/lib/Doctrine/ORM/Event/PreLoadClassMetadataEventArgs.php b/lib/Doctrine/ORM/Event/PreLoadClassMetadataEventArgs.php new file mode 100644 index 000000000..e111cdf59 --- /dev/null +++ b/lib/Doctrine/ORM/Event/PreLoadClassMetadataEventArgs.php @@ -0,0 +1,75 @@ +. + */ + +namespace Doctrine\ORM\Event; + +use Doctrine\Common\EventArgs; +use Doctrine\ORM\EntityManager; + +/** + * Class that holds event arguments for a loadMetadata event. + * + * @author Jonathan H. Wage + * @since 2.3 + */ +class PreLoadClassMetadataEventArgs extends EventArgs +{ + /** + * @var \Doctrine\ORM\Mapping\ClassMetadata + */ + private $className; + + /** + * @var \Doctrine\ORM\EntityManager + */ + private $em; + + /** + * Constructor. + * + * @param \Doctrine\ORM\Mapping\ClassMetadataInfo $classMetadata + * @param \Doctrine\ORM\EntityManager $em + */ + public function __construct($className, EntityManager $em) + { + $this->className = $className; + $this->em = $em; + } + + /** + * Retrieve associated ClassMetadata. + * + * @return \Doctrine\ORM\Mapping\ClassMetadataInfo + */ + public function getClassName() + { + return $this->className; + } + + /** + * Retrieve associated EntityManager. + * + * @return \Doctrine\ORM\EntityManager + */ + public function getEntityManager() + { + return $this->em; + } +} + diff --git a/lib/Doctrine/ORM/Events.php b/lib/Doctrine/ORM/Events.php index 8c13fa2d5..e27a4163a 100644 --- a/lib/Doctrine/ORM/Events.php +++ b/lib/Doctrine/ORM/Events.php @@ -119,6 +119,13 @@ final class Events * @var string */ const loadClassMetadata = 'loadClassMetadata'; + /** + * The preLoadClassMetadata event occurs before the mapping metadata for a + * class is loaded from a mapping source (annotations/xml/yaml). + * + * @var string + */ + const preLoadClassMetadata = 'preLoadClassMetadata'; /** * The preFlush event occurs when the EntityManager#flush() operation is invoked, diff --git a/lib/Doctrine/ORM/Tools/ResolveTargetEntityListener.php b/lib/Doctrine/ORM/Tools/ResolveTargetEntityListener.php index f0d3ce25f..374dba8ab 100644 --- a/lib/Doctrine/ORM/Tools/ResolveTargetEntityListener.php +++ b/lib/Doctrine/ORM/Tools/ResolveTargetEntityListener.php @@ -20,7 +20,10 @@ namespace Doctrine\ORM\Tools; use Doctrine\ORM\Event\LoadClassMetadataEventArgs; +use Doctrine\ORM\Event\PreLoadClassMetadataEventArgs; use Doctrine\ORM\Mapping\ClassMetadata; +use Doctrine\Common\EventSubscriber; +use Doctrine\ORM\Events; /** * ResolveTargetEntityListener @@ -31,13 +34,20 @@ use Doctrine\ORM\Mapping\ClassMetadata; * @author Benjamin Eberlei * @since 2.2 */ -class ResolveTargetEntityListener +class ResolveTargetEntityListener implements EventSubscriber { /** * @var array */ private $resolveTargetEntities = array(); + public function getSubscribedEvents() + { + return array( + Events::loadClassMetadata, + Events::preLoadClassMetadata + ); + } /** * Adds a target-entity class name to resolve to a new class name. * @@ -53,6 +63,13 @@ class ResolveTargetEntityListener $this->resolveTargetEntities[ltrim($originalEntity, "\\")] = $mapping; } + public function preLoadClassMetadata(PreLoadClassMetadataEventArgs $args) + { + if (array_key_exists($args->getClassName(), $this->resolveTargetEntities)) { + $args->getEntityManager()->getClassMetadata($this->resolveTargetEntities[$args->getClassname()]['targetEntity']); + } + } + /** * Processes event and resolves new target entity names. * diff --git a/tests/Doctrine/Tests/ORM/Tools/ResolveTargetEntityListenerTest.php b/tests/Doctrine/Tests/ORM/Tools/ResolveTargetEntityListenerTest.php index 9b7167a9c..a330e3c2e 100644 --- a/tests/Doctrine/Tests/ORM/Tools/ResolveTargetEntityListenerTest.php +++ b/tests/Doctrine/Tests/ORM/Tools/ResolveTargetEntityListenerTest.php @@ -2,7 +2,6 @@ namespace Doctrine\Tests\ORM\Tools; -use Doctrine\ORM\Events; use Doctrine\ORM\Mapping\ClassMetadataFactory; use Doctrine\ORM\Tools\ResolveTargetEntityListener; @@ -30,7 +29,7 @@ class ResolveTargetEntityListenerTest extends \Doctrine\Tests\OrmTestCase $this->em = $this->_getTestEntityManager(); $this->em->getConfiguration()->setMetadataDriverImpl($annotationDriver); $this->factory = $this->em->getMetadataFactory(); - $this->listener = new ResolveTargetEntityListener; + $this->listener = new ResolveTargetEntityListener(); } /** @@ -49,7 +48,7 @@ class ResolveTargetEntityListenerTest extends \Doctrine\Tests\OrmTestCase 'Doctrine\Tests\ORM\Tools\TargetEntity', array() ); - $evm->addEventListener(Events::loadClassMetadata, $this->listener); + $evm->addEventSubscriber($this->listener); $this->assertNotNull($this->factory->getMetadataFor('Doctrine\Tests\ORM\Tools\ResolveTargetInterface'));