Added new event to allow actions to be done before trying to load class metadata
This commit is contained in:
parent
19c52e4ae1
commit
437f812718
4 changed files with 102 additions and 4 deletions
75
lib/Doctrine/ORM/Event/PreLoadClassMetadataEventArgs.php
Normal file
75
lib/Doctrine/ORM/Event/PreLoadClassMetadataEventArgs.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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'));
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue