1
0
Fork 0
mirror of synced 2025-04-01 12:26:11 +03:00

Added new event to allow actions to be done before trying to load class metadata

This commit is contained in:
Bart van den Burg 2012-07-04 22:39:08 +02:00 committed by Marco Pivetta
parent 19c52e4ae1
commit 437f812718
4 changed files with 102 additions and 4 deletions

View file

@ -0,0 +1,75 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
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 <jonwage@gmail.com>
* @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;
}
}

View file

@ -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,

View file

@ -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 <kontakt@beberlei.de>
* @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.
*

View file

@ -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'));