1
0
mirror of synced 2025-01-18 22:41:43 +03:00

implements a entity listener resolver

This commit is contained in:
Fabio B. Silva 2012-08-12 22:10:47 -03:00 committed by fabio.silva
parent 27745bb87b
commit a01d6583d3
11 changed files with 390 additions and 131 deletions

View File

@ -29,6 +29,8 @@ use Doctrine\ORM\Mapping\QuoteStrategy;
use Doctrine\ORM\Mapping\DefaultQuoteStrategy;
use Doctrine\ORM\Mapping\NamingStrategy;
use Doctrine\ORM\Mapping\DefaultNamingStrategy;
use Doctrine\ORM\Mapping\EntityListenerResolver;
use Doctrine\ORM\Mapping\DefaultEntityListenerResolver;
use Doctrine\Common\Annotations\SimpleAnnotationReader;
use Doctrine\Common\Annotations\CachedReader;
@ -763,4 +765,30 @@ class Configuration extends \Doctrine\DBAL\Configuration
return $this->_attributes['quoteStrategy'];
}
/**
* Set the entity listener resolver.
*
* @since 2.4
* @param \Doctrine\ORM\Mapping\EntityListenerResolver $resolver
*/
public function setEntityListenerResolver(EntityListenerResolver $resolver)
{
$this->_attributes['entityListenerResolver'] = $resolver;
}
/**
* Get the entity listener resolver.
*
* @since 2.4
* @return \Doctrine\ORM\Mapping\EntityListenerResolver
*/
public function getEntityListenerResolver()
{
if ( ! isset($this->_attributes['entityListenerResolver'])) {
$this->_attributes['entityListenerResolver'] = new DefaultEntityListenerResolver();
}
return $this->_attributes['entityListenerResolver'];
}
}

View File

@ -27,6 +27,7 @@ use ReflectionClass;
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
use Doctrine\Common\ClassLoader;
use Doctrine\Common\EventArgs;
use Doctrine\ORM\Mapping\EntityListenerResolver;
/**
* A <tt>ClassMetadata</tt> instance holds all the object-relational mapping metadata
@ -444,11 +445,6 @@ class ClassMetadataInfo implements ClassMetadata
*/
public $entityListeners = array();
/**
* @var array entity listeners instances.
*/
static private $entityListenerInstances = array();
/**
* READ-ONLY: The association mappings of this class.
*
@ -2520,21 +2516,19 @@ class ClassMetadataInfo implements ClassMetadata
/**
* Call the entity listeners.
*
* @param \Doctrine\ORM\Mapping\EntityListenerResolver $resolver The Entity listener resolver.
* @param string $eventName The event name.
* @param object $entity An instance of the mapped entity
* @param \Doctrine\Common\EventArgs $arg The Event args
*/
public function dispatchEntityListeners($eventName, $entity, EventArgs $arg)
public function dispatchEntityListeners(EntityListenerResolver $resolver, $eventName, $entity, EventArgs $arg)
{
foreach ($this->entityListeners[$eventName] as $listener) {
$class = $listener['class'];
$method = $listener['method'];
$class = $listener['class'];
$method = $listener['method'];
$instance = $resolver->resolve($class);
if ( ! isset(self::$entityListenerInstances[$class])) {
self::$entityListenerInstances[$class] = new $class();
}
self::$entityListenerInstances[$class]->{$method}($entity, $arg);
$instance->{$method}($entity, $arg);
}
}

View File

@ -0,0 +1,76 @@
<?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\Mapping;
/**
* The default DefaultEntityListene
*
* @since 2.4
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
*/
class DefaultEntityListenerResolver implements EntityListenerResolver
{
/**
* @var array Map to store entity listener instances.
*/
private $instances = array();
/**
* {@inheritdoc}
*/
public function clear($className = null)
{
if ($className !== null) {
if (isset($this->instances[$className = trim($className, '\\')])) {
unset($this->instances[$className]);
}
return;
}
$this->instances = array();
}
/**
* {@inheritdoc}"
*/
public function register($object)
{
if ( ! is_object($object)) {
throw new \InvalidArgumentException(sprintf('An object was expected, but got "%s.', gettype($object)));
}
$this->instances[get_class($object)] = $object;
}
/**
* {@inheritdoc}
*/
public function resolve($className)
{
if (isset($this->instances[$className = trim($className, '\\')])) {
return $this->instances[$className];
}
return $this->instances[$className] = new $className();
}
}

View File

@ -0,0 +1,55 @@
<?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\Mapping;
/**
* A resolver is used to instantiate an entity listener.
*
* @since 2.4
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
*/
interface EntityListenerResolver
{
/**
* Clear all instances from the set, or a specific class when given.
*
* @param string $className The fully-qualified class name
*
* @return void
*/
function clear($className = null);
/**
* Returns a entity listener instance for the given class name.
*
* @param string $className The fully-qualified class name
*
* @return object An entity listener
*/
function resolve($className);
/**
* Register a entity listener instance.
*
* @return object An entity listener
*/
function register($object);
}

View File

@ -218,6 +218,13 @@ class UnitOfWork implements PropertyChangedListener
*/
private $evm;
/**
* The EntityListenerResolver used for dispatching events.
*
* @var \Doctrine\ORM\Mapping\EntityListenerResolver
*/
private $entityListenerResolver;
/**
* Orphaned entities that are scheduled for removal.
*
@ -246,8 +253,9 @@ class UnitOfWork implements PropertyChangedListener
*/
public function __construct(EntityManager $em)
{
$this->em = $em;
$this->evm = $em->getEventManager();
$this->em = $em;
$this->evm = $em->getEventManager();
$this->entityListenerResolver = $em->getConfiguration()->getEntityListenerResolver();
}
/**
@ -525,7 +533,7 @@ class UnitOfWork implements PropertyChangedListener
// Fire PreFlush entity listeners
if ($hasEntityListeners) {
$class->dispatchEntityListeners(Events::preFlush, $entity, $event);
$class->dispatchEntityListeners($this->entityListenerResolver, Events::preFlush, $entity, $event);
}
$actualData = array();
@ -836,7 +844,7 @@ class UnitOfWork implements PropertyChangedListener
}
if ($hasEntityListeners) {
$class->dispatchEntityListeners(Events::prePersist, $entity, $event);
$class->dispatchEntityListeners($this->entityListenerResolver, Events::prePersist, $entity, $event);
}
if ($hasListeners) {
@ -986,7 +994,7 @@ class UnitOfWork implements PropertyChangedListener
}
if ($hasEntityListeners) {
$class->dispatchEntityListeners(Events::postPersist, $entity, $event);
$class->dispatchEntityListeners($this->entityListenerResolver, Events::postPersist, $entity, $event);
}
if ($hasListeners) {
@ -1035,7 +1043,7 @@ class UnitOfWork implements PropertyChangedListener
}
if ($hasPreUpdateEntityListeners) {
$class->dispatchEntityListeners(Events::preUpdate, $entity, $preEvent);
$class->dispatchEntityListeners($this->entityListenerResolver, Events::preUpdate, $entity, $preEvent);
}
if ($hasPreUpdateListeners) {
@ -1053,7 +1061,7 @@ class UnitOfWork implements PropertyChangedListener
}
if ($hasPostUpdateEntityListeners) {
$class->dispatchEntityListeners(Events::postUpdate, $entity, $postEvent);
$class->dispatchEntityListeners($this->entityListenerResolver, Events::postUpdate, $entity, $postEvent);
}
if ($hasPostUpdateListeners) {
@ -1108,7 +1116,7 @@ class UnitOfWork implements PropertyChangedListener
}
if ($hasEntityListeners) {
$class->dispatchEntityListeners(Events::postRemove, $entity, $event);
$class->dispatchEntityListeners($this->entityListenerResolver, Events::postRemove, $entity, $event);
}
if ($hasListeners) {
@ -1765,7 +1773,7 @@ class UnitOfWork implements PropertyChangedListener
}
if ($hasEntityListeners) {
$class->dispatchEntityListeners(Events::preRemove, $entity, $event);
$class->dispatchEntityListeners($this->entityListenerResolver, Events::preRemove, $entity, $event);
}
if ($hasListeners) {
@ -2781,7 +2789,7 @@ class UnitOfWork implements PropertyChangedListener
}
if ($hasEntityListeners) {
$class->dispatchEntityListeners(Events::postLoad, $entity, $event);
$class->dispatchEntityListeners($this->entityListenerResolver, Events::postLoad, $entity, $event);
}
if ($hasListeners) {

View File

@ -4,32 +4,25 @@ namespace Doctrine\Tests\Models\Company;
class CompanyContractListener
{
static public $postPersistCalls;
static public $prePersistCalls;
public $postPersistCalls;
public $prePersistCalls;
static public $postUpdateCalls;
static public $preUpdateCalls;
public $postUpdateCalls;
public $preUpdateCalls;
static public $postRemoveCalls;
static public $preRemoveCalls;
public $postRemoveCalls;
public $preRemoveCalls;
static public $preFlushCalls;
public $preFlushCalls;
static public $postLoadCalls;
public $postLoadCalls;
static public $instances;
public function __construct()
{
self::$instances[] = $this;
}
/**
* @PostPersist
*/
public function postPersistHandler(CompanyContract $contract)
{
self::$postPersistCalls[] = func_get_args();
$this->postPersistCalls[] = func_get_args();
}
/**
@ -37,7 +30,7 @@ class CompanyContractListener
*/
public function prePersistHandler(CompanyContract $contract)
{
self::$prePersistCalls[] = func_get_args();
$this->prePersistCalls[] = func_get_args();
}
/**
@ -45,7 +38,7 @@ class CompanyContractListener
*/
public function postUpdateHandler(CompanyContract $contract)
{
self::$postUpdateCalls[] = func_get_args();
$this->postUpdateCalls[] = func_get_args();
}
/**
@ -53,7 +46,7 @@ class CompanyContractListener
*/
public function preUpdateHandler(CompanyContract $contract)
{
self::$preUpdateCalls[] = func_get_args();
$this->preUpdateCalls[] = func_get_args();
}
/**
@ -61,7 +54,7 @@ class CompanyContractListener
*/
public function postRemoveHandler(CompanyContract $contract)
{
self::$postRemoveCalls[] = func_get_args();
$this->postRemoveCalls[] = func_get_args();
}
/**
@ -69,7 +62,7 @@ class CompanyContractListener
*/
public function preRemoveHandler(CompanyContract $contract)
{
self::$preRemoveCalls[] = func_get_args();
$this->preRemoveCalls[] = func_get_args();
}
/**
@ -77,7 +70,7 @@ class CompanyContractListener
*/
public function preFlushHandler(CompanyContract $contract)
{
self::$preFlushCalls[] = func_get_args();
$this->preFlushCalls[] = func_get_args();
}
/**
@ -85,7 +78,7 @@ class CompanyContractListener
*/
public function postLoadHandler(CompanyContract $contract)
{
self::$postLoadCalls[] = func_get_args();
$this->postLoadCalls[] = func_get_args();
}
}

View File

@ -6,20 +6,14 @@ use Doctrine\ORM\Event\LifecycleEventArgs;
class CompanyFlexUltraContractListener
{
static public $prePersistCalls;
static public $instances;
public function __construct()
{
self::$instances[] = $this;
}
public $prePersistCalls;
/**
* @PrePersist
*/
public function prePersistHandler1(CompanyContract $contract, LifecycleEventArgs $args)
{
self::$prePersistCalls[] = func_get_args();
$this->prePersistCalls[] = func_get_args();
}
/**
@ -27,6 +21,6 @@ class CompanyFlexUltraContractListener
*/
public function prePersistHandler2(CompanyContract $contract, LifecycleEventArgs $args)
{
self::$prePersistCalls[] = func_get_args();
$this->prePersistCalls[] = func_get_args();
}
}

View File

@ -260,6 +260,18 @@ class ConfigurationTest extends PHPUnit_Framework_TestCase
$this->configuration->setQuoteStrategy($quoteStrategy);
$this->assertSame($quoteStrategy, $this->configuration->getQuoteStrategy());
}
/**
* @group DDC-1955
*/
public function testSetGetEntityListenerResolver()
{
$this->assertInstanceOf('Doctrine\ORM\Mapping\EntityListenerResolver', $this->configuration->getEntityListenerResolver());
$this->assertInstanceOf('Doctrine\ORM\Mapping\DefaultEntityListenerResolver', $this->configuration->getEntityListenerResolver());
$quoteStrategy = $this->getMock('Doctrine\ORM\Mapping\EntityListenerResolver');
$this->configuration->setEntityListenerResolver($quoteStrategy);
$this->assertSame($quoteStrategy, $this->configuration->getEntityListenerResolver());
}
}
class ConfigurationTestAnnotationReaderChecker

View File

@ -3,7 +3,6 @@
namespace Doctrine\Tests\ORM\Functional;
use Doctrine\Tests\Models\Company\CompanyFixContract;
use Doctrine\Tests\Models\Company\CompanyContractListener;
require_once __DIR__ . '/../../TestInit.php';
@ -13,10 +12,19 @@ require_once __DIR__ . '/../../TestInit.php';
class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
{
/**
* @var \Doctrine\Tests\Models\Company\CompanyContractListener
*/
private $listener;
protected function setUp()
{
$this->useModelSet('company');
parent::setUp();
$this->listener = $this->_em->getConfiguration()
->getEntityListenerResolver()
->resolve('Doctrine\Tests\Models\Company\CompanyContractListener');
}
public function testPreFlushListeners()
@ -24,24 +32,23 @@ class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
$fix = new CompanyFixContract();
$fix->setFixPrice(2000);
CompanyContractListener::$preFlushCalls = array();
$this->listener->preFlushCalls = array();
$this->_em->persist($fix);
$this->_em->flush();
$this->assertCount(1,CompanyContractListener::$instances);
$this->assertCount(1,CompanyContractListener::$preFlushCalls);
$this->assertCount(1,$this->listener->preFlushCalls);
$this->assertSame($fix, CompanyContractListener::$preFlushCalls[0][0]);
$this->assertSame($fix, $this->listener->preFlushCalls[0][0]);
$this->assertInstanceOf(
'Doctrine\Tests\Models\Company\CompanyFixContract',
CompanyContractListener::$preFlushCalls[0][0]
$this->listener->preFlushCalls[0][0]
);
$this->assertInstanceOf(
'Doctrine\ORM\Event\PreFlushEventArgs',
CompanyContractListener::$preFlushCalls[0][1]
$this->listener->preFlushCalls[0][1]
);
}
@ -54,24 +61,23 @@ class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->_em->flush();
$this->_em->clear();
CompanyContractListener::$postLoadCalls = array();
$this->listener->postLoadCalls = array();
$dql = "SELECT f FROM Doctrine\Tests\Models\Company\CompanyFixContract f WHERE f.id = ?1";
$fix = $this->_em->createQuery($dql)->setParameter(1, $fix->getId())->getSingleResult();
$this->assertCount(1,CompanyContractListener::$instances);
$this->assertCount(1,CompanyContractListener::$postLoadCalls);
$this->assertCount(1,$this->listener->postLoadCalls);
$this->assertSame($fix, CompanyContractListener::$postLoadCalls[0][0]);
$this->assertSame($fix, $this->listener->postLoadCalls[0][0]);
$this->assertInstanceOf(
'Doctrine\Tests\Models\Company\CompanyFixContract',
CompanyContractListener::$postLoadCalls[0][0]
$this->listener->postLoadCalls[0][0]
);
$this->assertInstanceOf(
'Doctrine\ORM\Event\LifecycleEventArgs',
CompanyContractListener::$postLoadCalls[0][1]
$this->listener->postLoadCalls[0][1]
);
}
@ -80,24 +86,23 @@ class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
$fix = new CompanyFixContract();
$fix->setFixPrice(2000);
CompanyContractListener::$prePersistCalls = array();
$this->listener->prePersistCalls = array();
$this->_em->persist($fix);
$this->_em->flush();
$this->assertCount(1,CompanyContractListener::$instances);
$this->assertCount(1,CompanyContractListener::$prePersistCalls);
$this->assertCount(1,$this->listener->prePersistCalls);
$this->assertSame($fix, CompanyContractListener::$prePersistCalls[0][0]);
$this->assertSame($fix, $this->listener->prePersistCalls[0][0]);
$this->assertInstanceOf(
'Doctrine\Tests\Models\Company\CompanyFixContract',
CompanyContractListener::$prePersistCalls[0][0]
$this->listener->prePersistCalls[0][0]
);
$this->assertInstanceOf(
'Doctrine\ORM\Event\LifecycleEventArgs',
CompanyContractListener::$prePersistCalls[0][1]
$this->listener->prePersistCalls[0][1]
);
}
@ -106,24 +111,23 @@ class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
$fix = new CompanyFixContract();
$fix->setFixPrice(2000);
CompanyContractListener::$postPersistCalls = array();
$this->listener->postPersistCalls = array();
$this->_em->persist($fix);
$this->_em->flush();
$this->assertCount(1,CompanyContractListener::$instances);
$this->assertCount(1,CompanyContractListener::$postPersistCalls);
$this->assertCount(1,$this->listener->postPersistCalls);
$this->assertSame($fix, CompanyContractListener::$postPersistCalls[0][0]);
$this->assertSame($fix, $this->listener->postPersistCalls[0][0]);
$this->assertInstanceOf(
'Doctrine\Tests\Models\Company\CompanyFixContract',
CompanyContractListener::$postPersistCalls[0][0]
$this->listener->postPersistCalls[0][0]
);
$this->assertInstanceOf(
'Doctrine\ORM\Event\LifecycleEventArgs',
CompanyContractListener::$postPersistCalls[0][1]
$this->listener->postPersistCalls[0][1]
);
}
@ -135,26 +139,25 @@ class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->_em->persist($fix);
$this->_em->flush();
CompanyContractListener::$preUpdateCalls = array();
$this->listener->preUpdateCalls = array();
$fix->setFixPrice(2000);
$this->_em->persist($fix);
$this->_em->flush();
$this->assertCount(1,CompanyContractListener::$instances);
$this->assertCount(1,CompanyContractListener::$preUpdateCalls);
$this->assertCount(1,$this->listener->preUpdateCalls);
$this->assertSame($fix, CompanyContractListener::$preUpdateCalls[0][0]);
$this->assertSame($fix, $this->listener->preUpdateCalls[0][0]);
$this->assertInstanceOf(
'Doctrine\Tests\Models\Company\CompanyFixContract',
CompanyContractListener::$preUpdateCalls[0][0]
$this->listener->preUpdateCalls[0][0]
);
$this->assertInstanceOf(
'Doctrine\ORM\Event\PreUpdateEventArgs',
CompanyContractListener::$preUpdateCalls[0][1]
$this->listener->preUpdateCalls[0][1]
);
}
@ -166,26 +169,25 @@ class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->_em->persist($fix);
$this->_em->flush();
CompanyContractListener::$postUpdateCalls = array();
$this->listener->postUpdateCalls = array();
$fix->setFixPrice(2000);
$this->_em->persist($fix);
$this->_em->flush();
$this->assertCount(1,CompanyContractListener::$instances);
$this->assertCount(1,CompanyContractListener::$postUpdateCalls);
$this->assertCount(1,$this->listener->postUpdateCalls);
$this->assertSame($fix, CompanyContractListener::$postUpdateCalls[0][0]);
$this->assertSame($fix, $this->listener->postUpdateCalls[0][0]);
$this->assertInstanceOf(
'Doctrine\Tests\Models\Company\CompanyFixContract',
CompanyContractListener::$postUpdateCalls[0][0]
$this->listener->postUpdateCalls[0][0]
);
$this->assertInstanceOf(
'Doctrine\ORM\Event\LifecycleEventArgs',
CompanyContractListener::$postUpdateCalls[0][1]
$this->listener->postUpdateCalls[0][1]
);
}
@ -197,24 +199,23 @@ class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->_em->persist($fix);
$this->_em->flush();
CompanyContractListener::$preRemoveCalls = array();
$this->listener->preRemoveCalls = array();
$this->_em->remove($fix);
$this->_em->flush();
$this->assertCount(1,CompanyContractListener::$instances);
$this->assertCount(1,CompanyContractListener::$preRemoveCalls);
$this->assertCount(1,$this->listener->preRemoveCalls);
$this->assertSame($fix, CompanyContractListener::$preRemoveCalls[0][0]);
$this->assertSame($fix, $this->listener->preRemoveCalls[0][0]);
$this->assertInstanceOf(
'Doctrine\Tests\Models\Company\CompanyFixContract',
CompanyContractListener::$preRemoveCalls[0][0]
$this->listener->preRemoveCalls[0][0]
);
$this->assertInstanceOf(
'Doctrine\ORM\Event\LifecycleEventArgs',
CompanyContractListener::$preRemoveCalls[0][1]
$this->listener->preRemoveCalls[0][1]
);
}
@ -226,24 +227,23 @@ class EntityListenersTest extends \Doctrine\Tests\OrmFunctionalTestCase
$this->_em->persist($fix);
$this->_em->flush();
CompanyContractListener::$postRemoveCalls = array();
$this->listener->postRemoveCalls = array();
$this->_em->remove($fix);
$this->_em->flush();
$this->assertCount(1,CompanyContractListener::$instances);
$this->assertCount(1,CompanyContractListener::$postRemoveCalls);
$this->assertCount(1,$this->listener->postRemoveCalls);
$this->assertSame($fix, CompanyContractListener::$postRemoveCalls[0][0]);
$this->assertSame($fix, $this->listener->postRemoveCalls[0][0]);
$this->assertInstanceOf(
'Doctrine\Tests\Models\Company\CompanyFixContract',
CompanyContractListener::$postRemoveCalls[0][0]
$this->listener->postRemoveCalls[0][0]
);
$this->assertInstanceOf(
'Doctrine\ORM\Event\LifecycleEventArgs',
CompanyContractListener::$postRemoveCalls[0][1]
$this->listener->postRemoveCalls[0][1]
);
}
}

View File

@ -6,8 +6,6 @@ use Doctrine\ORM\Events;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\Tests\Models\Company\CompanyFixContract;
use Doctrine\Tests\Models\Company\CompanyFlexContract;
use Doctrine\Tests\Models\Company\CompanyContractListener;
use Doctrine\Tests\Models\Company\CompanyFlexUltraContractListener;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
@ -812,15 +810,18 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase
*/
public function testCallEntityListeners()
{
$em = $this->_getTestEntityManager();
$factory = $this->createClassMetadataFactory($em);
$flexClass = $factory->getMetadataFor('Doctrine\Tests\Models\Company\CompanyFixContract');
$fixClass = $factory->getMetadataFor('Doctrine\Tests\Models\Company\CompanyFlexContract');
$ultraClass = $factory->getMetadataFor('Doctrine\Tests\Models\Company\CompanyFlexUltraContract');
$em = $this->_getTestEntityManager();
$factory = $this->createClassMetadataFactory($em);
$resolver = $em->getConfiguration()->getEntityListenerResolver();
$flexClass = $factory->getMetadataFor('Doctrine\Tests\Models\Company\CompanyFixContract');
$fixClass = $factory->getMetadataFor('Doctrine\Tests\Models\Company\CompanyFlexContract');
$ultraClass = $factory->getMetadataFor('Doctrine\Tests\Models\Company\CompanyFlexUltraContract');
$contractListener = $resolver->resolve('Doctrine\Tests\Models\Company\CompanyContractListener');
$ultraContractListener = $resolver->resolve('Doctrine\Tests\Models\Company\CompanyFlexUltraContractListener');
CompanyContractListener::$prePersistCalls = array();
CompanyContractListener::$postPersistCalls = array();
CompanyFlexUltraContractListener::$prePersistCalls = array();
$contractListener->prePersistCalls = array();
$contractListener->postPersistCalls = array();
$ultraContractListener->prePersistCalls = array();
$fix = new CompanyFixContract();
$fixArg = new LifecycleEventArgs($fix, $em);
@ -831,30 +832,29 @@ abstract class AbstractMappingDriverTest extends \Doctrine\Tests\OrmTestCase
$ultra = new CompanyFlexContract();
$ultraArg = new LifecycleEventArgs($ultra, $em);
$fixClass->dispatchEntityListeners(Events::prePersist, $fix, $fixArg);
$flexClass->dispatchEntityListeners(Events::prePersist, $flex, $flexArg);
$ultraClass->dispatchEntityListeners(Events::prePersist, $ultra, $ultraArg);
$fixClass->dispatchEntityListeners($resolver, Events::prePersist, $fix, $fixArg);
$flexClass->dispatchEntityListeners($resolver, Events::prePersist, $flex, $flexArg);
$ultraClass->dispatchEntityListeners($resolver, Events::prePersist, $ultra, $ultraArg);
$this->assertCount(3, CompanyContractListener::$prePersistCalls);
$this->assertCount(2, CompanyFlexUltraContractListener::$prePersistCalls);
$this->assertCount(3, $contractListener->prePersistCalls);
$this->assertCount(2, $ultraContractListener->prePersistCalls);
$this->assertSame($fix, CompanyContractListener::$prePersistCalls[0][0]);
$this->assertSame($fixArg, CompanyContractListener::$prePersistCalls[0][1]);
$this->assertSame($fix, $contractListener->prePersistCalls[0][0]);
$this->assertSame($fixArg, $contractListener->prePersistCalls[0][1]);
$this->assertSame($flex, CompanyContractListener::$prePersistCalls[1][0]);
$this->assertSame($flexArg, CompanyContractListener::$prePersistCalls[1][1]);
$this->assertSame($flex, $contractListener->prePersistCalls[1][0]);
$this->assertSame($flexArg, $contractListener->prePersistCalls[1][1]);
$this->assertSame($ultra, CompanyContractListener::$prePersistCalls[2][0]);
$this->assertSame($ultraArg, CompanyContractListener::$prePersistCalls[2][1]);
$this->assertSame($ultra, $contractListener->prePersistCalls[2][0]);
$this->assertSame($ultraArg, $contractListener->prePersistCalls[2][1]);
$this->assertSame($ultra, CompanyFlexUltraContractListener::$prePersistCalls[0][0]);
$this->assertSame($ultraArg, CompanyFlexUltraContractListener::$prePersistCalls[0][1]);
$this->assertSame($ultra, $ultraContractListener->prePersistCalls[0][0]);
$this->assertSame($ultraArg, $ultraContractListener->prePersistCalls[0][1]);
$this->assertSame($ultra, CompanyFlexUltraContractListener::$prePersistCalls[1][0]);
$this->assertSame($ultraArg, CompanyFlexUltraContractListener::$prePersistCalls[1][1]);
$this->assertSame($ultra, $ultraContractListener->prePersistCalls[1][0]);
$this->assertSame($ultraArg, $ultraContractListener->prePersistCalls[1][1]);
$this->assertCount(1, CompanyContractListener::$instances);
$this->assertEmpty(CompanyContractListener::$postPersistCalls);
$this->assertEmpty($contractListener->postPersistCalls);
}
/**

View File

@ -0,0 +1,99 @@
<?php
namespace Doctrine\Tests\ORM\Mapping;
use Doctrine\ORM\Mapping\DefaultEntityListenerResolver;
require_once __DIR__ . '/../../TestInit.php';
/**
* @group DDC-1955
*/
class ListenerResolverTest extends \Doctrine\Tests\OrmTestCase
{
/**
* @var \Doctrine\ORM\Mapping\DefaultEntityListenerResolver
*/
private $resolver;
protected function setUp()
{
parent::setUp();
$this->resolver = new DefaultEntityListenerResolver();
}
public function testResolve()
{
$className = '\Doctrine\Tests\Models\Company\CompanyContractListener';
$object = $this->resolver->resolve($className);
$this->assertInstanceOf($className, $object);
$this->assertSame($object, $this->resolver->resolve($className));
}
public function testRegisterAndResolve()
{
$className = '\Doctrine\Tests\Models\Company\CompanyContractListener';
$object = new $className();
$this->resolver->register($object);
$this->assertSame($object, $this->resolver->resolve($className));
}
public function testClearOne()
{
$className1 = '\Doctrine\Tests\Models\Company\CompanyContractListener';
$className2 = '\Doctrine\Tests\Models\Company\CompanyFlexUltraContractListener';
$obj1 = $this->resolver->resolve($className1);
$obj2 = $this->resolver->resolve($className2);
$this->assertInstanceOf($className1, $obj1);
$this->assertInstanceOf($className2, $obj2);
$this->assertSame($obj1, $this->resolver->resolve($className1));
$this->assertSame($obj2, $this->resolver->resolve($className2));
$this->resolver->clear($className1);
$this->assertInstanceOf($className1, $this->resolver->resolve($className1));
$this->assertInstanceOf($className2, $this->resolver->resolve($className2));
$this->assertNotSame($obj1, $this->resolver->resolve($className1));
$this->assertSame($obj2, $this->resolver->resolve($className2));
}
public function testClearAll()
{
$className1 = '\Doctrine\Tests\Models\Company\CompanyContractListener';
$className2 = '\Doctrine\Tests\Models\Company\CompanyFlexUltraContractListener';
$obj1 = $this->resolver->resolve($className1);
$obj2 = $this->resolver->resolve($className2);
$this->assertInstanceOf($className1, $obj1);
$this->assertInstanceOf($className2, $obj2);
$this->assertSame($obj1, $this->resolver->resolve($className1));
$this->assertSame($obj2, $this->resolver->resolve($className2));
$this->resolver->clear();
$this->assertInstanceOf($className1, $this->resolver->resolve($className1));
$this->assertInstanceOf($className2, $this->resolver->resolve($className2));
$this->assertNotSame($obj1, $this->resolver->resolve($className1));
$this->assertNotSame($obj2, $this->resolver->resolve($className2));
}
/**
* @expectedException InvalidArgumentException
* @expectedExceptionMessage An object was expected, but got "string.
*/
public function testRegisterStringException()
{
$this->resolver->register('CompanyContractListener');
}
}