implements a entity listener resolver
This commit is contained in:
parent
27745bb87b
commit
a01d6583d3
@ -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'];
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
76
lib/Doctrine/ORM/Mapping/DefaultEntityListenerResolver.php
Normal file
76
lib/Doctrine/ORM/Mapping/DefaultEntityListenerResolver.php
Normal 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();
|
||||
}
|
||||
}
|
55
lib/Doctrine/ORM/Mapping/EntityListenerResolver.php
Normal file
55
lib/Doctrine/ORM/Mapping/EntityListenerResolver.php
Normal 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);
|
||||
}
|
@ -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) {
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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]
|
||||
);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
99
tests/Doctrine/Tests/ORM/Mapping/ListenerResolverTest.php
Normal file
99
tests/Doctrine/Tests/ORM/Mapping/ListenerResolverTest.php
Normal 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');
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user