Avoid Doctrine\Listener::getSubscribedEvents() call on each page where doctrine is active

This commit is contained in:
Dmitry Korotovsky 2014-10-18 21:25:38 +04:00 committed by Tim Nagel
parent f3e31e613e
commit d731443aa5
4 changed files with 15 additions and 31 deletions

View file

@ -464,18 +464,22 @@ class FOSElasticaExtension extends Extension
$listenerId = sprintf('fos_elastica.listener.%s.%s', $indexName, $typeName); $listenerId = sprintf('fos_elastica.listener.%s.%s', $indexName, $typeName);
$listenerDef = new DefinitionDecorator($abstractListenerId); $listenerDef = new DefinitionDecorator($abstractListenerId);
$listenerDef->replaceArgument(0, new Reference($objectPersisterId)); $listenerDef->replaceArgument(0, new Reference($objectPersisterId));
$listenerDef->replaceArgument(1, $this->getDoctrineEvents($typeConfig)); $listenerDef->replaceArgument(2, array(
$listenerDef->replaceArgument(3, array(
'identifier' => $typeConfig['identifier'], 'identifier' => $typeConfig['identifier'],
'indexName' => $indexName, 'indexName' => $indexName,
'typeName' => $typeName, 'typeName' => $typeName,
)); ));
if ($typeConfig['listener']['logger']) { if ($typeConfig['listener']['logger']) {
$listenerDef->replaceArgument(4, new Reference($typeConfig['listener']['logger'])); $listenerDef->replaceArgument(3, new Reference($typeConfig['listener']['logger']));
} }
switch ($typeConfig['driver']) { switch ($typeConfig['driver']) {
case 'orm': $listenerDef->addTag('doctrine.event_subscriber'); break; case 'orm':
foreach ($this->getDoctrineEvents($typeConfig) as $event) {
$listenerDef->addTag('doctrine.event_listener', array('event' => $event));
}
break;
case 'mongodb': $listenerDef->addTag('doctrine_mongodb.odm.event_subscriber'); break; case 'mongodb': $listenerDef->addTag('doctrine_mongodb.odm.event_subscriber'); break;
} }

View file

@ -2,7 +2,6 @@
namespace FOS\ElasticaBundle\Doctrine; namespace FOS\ElasticaBundle\Doctrine;
use Doctrine\Common\EventSubscriber;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs; use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use FOS\ElasticaBundle\Persister\ObjectPersisterInterface; use FOS\ElasticaBundle\Persister\ObjectPersisterInterface;
use FOS\ElasticaBundle\Persister\ObjectPersister; use FOS\ElasticaBundle\Persister\ObjectPersister;
@ -14,7 +13,7 @@ use Symfony\Component\PropertyAccess\PropertyAccessorInterface;
* Automatically update ElasticSearch based on changes to the Doctrine source * Automatically update ElasticSearch based on changes to the Doctrine source
* data. One listener is generated for each Doctrine entity / ElasticSearch type. * data. One listener is generated for each Doctrine entity / ElasticSearch type.
*/ */
class Listener implements EventSubscriber class Listener
{ {
/** /**
* Object persister * Object persister
@ -23,13 +22,6 @@ class Listener implements EventSubscriber
*/ */
protected $objectPersister; protected $objectPersister;
/**
* List of subscribed events
*
* @var array
*/
protected $events;
/** /**
* Configuration for the listener * Configuration for the listener
* *
@ -74,14 +66,12 @@ class Listener implements EventSubscriber
* Constructor. * Constructor.
* *
* @param ObjectPersisterInterface $objectPersister * @param ObjectPersisterInterface $objectPersister
* @param array $events
* @param IndexableInterface $indexable * @param IndexableInterface $indexable
* @param array $config * @param array $config
* @param null $logger * @param null $logger
*/ */
public function __construct( public function __construct(
ObjectPersisterInterface $objectPersister, ObjectPersisterInterface $objectPersister,
array $events,
IndexableInterface $indexable, IndexableInterface $indexable,
array $config = array(), array $config = array(),
$logger = null $logger = null
@ -89,7 +79,6 @@ class Listener implements EventSubscriber
$this->config = array_merge(array( $this->config = array_merge(array(
'identifier' => 'id', 'identifier' => 'id',
), $config); ), $config);
$this->events = $events;
$this->indexable = $indexable; $this->indexable = $indexable;
$this->objectPersister = $objectPersister; $this->objectPersister = $objectPersister;
$this->propertyAccessor = PropertyAccess::createPropertyAccessor(); $this->propertyAccessor = PropertyAccess::createPropertyAccessor();
@ -99,14 +88,6 @@ class Listener implements EventSubscriber
} }
} }
/**
* @see Doctrine\Common\EventSubscriber::getSubscribedEvents()
*/
public function getSubscribedEvents()
{
return $this->events;
}
/** /**
* Looks for new objects that should be indexed. * Looks for new objects that should be indexed.
* *

View file

@ -22,7 +22,6 @@
<service id="fos_elastica.listener.prototype.orm" class="%fos_elastica.listener.prototype.orm.class%" public="false" abstract="true"> <service id="fos_elastica.listener.prototype.orm" class="%fos_elastica.listener.prototype.orm.class%" public="false" abstract="true">
<argument /> <!-- object persister --> <argument /> <!-- object persister -->
<argument type="collection" /> <!-- events -->
<argument type="service" id="fos_elastica.indexable" /> <argument type="service" id="fos_elastica.indexable" />
<argument type="collection" /> <!-- configuration --> <argument type="collection" /> <!-- configuration -->
<argument on-invalid="ignore" /> <!-- logger --> <argument on-invalid="ignore" /> <!-- logger -->

View file

@ -16,7 +16,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase
$eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager()); $eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager());
$indexable = $this->getMockIndexable('index', 'type', $entity, true); $indexable = $this->getMockIndexable('index', 'type', $entity, true);
$listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener = $this->createListener($persister, $indexable, array('indexName' => 'index', 'typeName' => 'type'));
$listener->postPersist($eventArgs); $listener->postPersist($eventArgs);
$this->assertEquals($entity, current($listener->scheduledForInsertion)); $this->assertEquals($entity, current($listener->scheduledForInsertion));
@ -35,7 +35,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase
$eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager()); $eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager());
$indexable = $this->getMockIndexable('index', 'type', $entity, false); $indexable = $this->getMockIndexable('index', 'type', $entity, false);
$listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener = $this->createListener($persister, $indexable, array('indexName' => 'index', 'typeName' => 'type'));
$listener->postPersist($eventArgs); $listener->postPersist($eventArgs);
$this->assertEmpty($listener->scheduledForInsertion); $this->assertEmpty($listener->scheduledForInsertion);
@ -55,7 +55,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase
$eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager()); $eventArgs = $this->createLifecycleEventArgs($entity, $this->getMockObjectManager());
$indexable = $this->getMockIndexable('index', 'type', $entity, true); $indexable = $this->getMockIndexable('index', 'type', $entity, true);
$listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener = $this->createListener($persister, $indexable, array('indexName' => 'index', 'typeName' => 'type'));
$listener->postUpdate($eventArgs); $listener->postUpdate($eventArgs);
$this->assertEquals($entity, current($listener->scheduledForUpdate)); $this->assertEquals($entity, current($listener->scheduledForUpdate));
@ -89,7 +89,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase
->with($entity, 'id') ->with($entity, 'id')
->will($this->returnValue($entity->getId())); ->will($this->returnValue($entity->getId()));
$listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener = $this->createListener($persister, $indexable, array('indexName' => 'index', 'typeName' => 'type'));
$listener->postUpdate($eventArgs); $listener->postUpdate($eventArgs);
$this->assertEmpty($listener->scheduledForUpdate); $this->assertEmpty($listener->scheduledForUpdate);
@ -124,7 +124,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase
->with($entity, 'id') ->with($entity, 'id')
->will($this->returnValue($entity->getId())); ->will($this->returnValue($entity->getId()));
$listener = $this->createListener($persister, array(), $indexable, array('indexName' => 'index', 'typeName' => 'type')); $listener = $this->createListener($persister, $indexable, array('indexName' => 'index', 'typeName' => 'type'));
$listener->preRemove($eventArgs); $listener->preRemove($eventArgs);
$this->assertEquals($entity->getId(), current($listener->scheduledForDeletion)); $this->assertEquals($entity->getId(), current($listener->scheduledForDeletion));
@ -157,7 +157,7 @@ abstract class ListenerTest extends \PHPUnit_Framework_TestCase
->with($entity, 'identifier') ->with($entity, 'identifier')
->will($this->returnValue($entity->getId())); ->will($this->returnValue($entity->getId()));
$listener = $this->createListener($persister, array(), $indexable, array('identifier' => 'identifier', 'indexName' => 'index', 'typeName' => 'type')); $listener = $this->createListener($persister, $indexable, array('identifier' => 'identifier', 'indexName' => 'index', 'typeName' => 'type'));
$listener->preRemove($eventArgs); $listener->preRemove($eventArgs);
$this->assertEquals($entity->identifier, current($listener->scheduledForDeletion)); $this->assertEquals($entity->identifier, current($listener->scheduledForDeletion));