Respect parent class contract in ContainerAwareDoctrineEventManager
This commit is contained in:
parent
e197c9ab1b
commit
42d62721fd
@ -37,51 +37,49 @@ class ContainerAwareEventManager extends EventManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dispatches an event to all registered listeners.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param string $eventName The name of the event to dispatch. The name of the event is
|
|
||||||
* the name of the method that is invoked on listeners.
|
|
||||||
* @param EventArgs $eventArgs The event arguments to pass to the event handlers/listeners.
|
|
||||||
* If not supplied, the single empty EventArgs instance is used.
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
*/
|
||||||
public function dispatchEvent($eventName, EventArgs $eventArgs = null)
|
public function dispatchEvent($eventName, EventArgs $eventArgs = null)
|
||||||
{
|
{
|
||||||
if (isset($this->listeners[$eventName])) {
|
if (!isset($this->listeners[$eventName])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
$eventArgs = null === $eventArgs ? EventArgs::getEmptyInstance() : $eventArgs;
|
$eventArgs = null === $eventArgs ? EventArgs::getEmptyInstance() : $eventArgs;
|
||||||
|
|
||||||
$initialized = isset($this->initialized[$eventName]);
|
if (!isset($this->initialized[$eventName])) {
|
||||||
|
$this->initializeListeners($eventName);
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($this->listeners[$eventName] as $hash => $listener) {
|
foreach ($this->listeners[$eventName] as $hash => $listener) {
|
||||||
if (!$initialized && \is_string($listener)) {
|
|
||||||
$this->listeners[$eventName][$hash] = $listener = $this->container->get($listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
$listener->$eventName($eventArgs);
|
$listener->$eventName($eventArgs);
|
||||||
}
|
}
|
||||||
$this->initialized[$eventName] = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the listeners of a specific event or all listeners.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param string $event The name of the event
|
|
||||||
*
|
|
||||||
* @return array The event listeners for the specified event, or all event listeners
|
|
||||||
*/
|
*/
|
||||||
public function getListeners($event = null)
|
public function getListeners($event = null)
|
||||||
{
|
{
|
||||||
return $event ? $this->listeners[$event] : $this->listeners;
|
if (null !== $event) {
|
||||||
|
if (!isset($this->initialized[$event])) {
|
||||||
|
$this->initializeListeners($event);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->listeners[$event];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->listeners as $event => $listeners) {
|
||||||
|
if (!isset($this->initialized[$event])) {
|
||||||
|
$this->initializeListeners($event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->listeners;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether an event has any registered listeners.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param string $event
|
|
||||||
*
|
|
||||||
* @return bool TRUE if the specified event has any listeners, FALSE otherwise
|
|
||||||
*/
|
*/
|
||||||
public function hasListeners($event)
|
public function hasListeners($event)
|
||||||
{
|
{
|
||||||
@ -89,20 +87,11 @@ class ContainerAwareEventManager extends EventManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an event listener that listens on the specified events.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param string|array $events The event(s) to listen on
|
|
||||||
* @param object|string $listener The listener object
|
|
||||||
*
|
|
||||||
* @throws \RuntimeException
|
|
||||||
*/
|
*/
|
||||||
public function addEventListener($events, $listener)
|
public function addEventListener($events, $listener)
|
||||||
{
|
{
|
||||||
if (\is_string($listener)) {
|
if (\is_string($listener)) {
|
||||||
if ($this->initialized) {
|
|
||||||
throw new \RuntimeException('Adding lazy-loading listeners after construction is not supported.');
|
|
||||||
}
|
|
||||||
|
|
||||||
$hash = '_service_'.$listener;
|
$hash = '_service_'.$listener;
|
||||||
} else {
|
} else {
|
||||||
// Picks the hash code related to that listener
|
// Picks the hash code related to that listener
|
||||||
@ -113,14 +102,15 @@ class ContainerAwareEventManager extends EventManager
|
|||||||
// Overrides listener if a previous one was associated already
|
// Overrides listener if a previous one was associated already
|
||||||
// Prevents duplicate listeners on same event (same instance only)
|
// Prevents duplicate listeners on same event (same instance only)
|
||||||
$this->listeners[$event][$hash] = $listener;
|
$this->listeners[$event][$hash] = $listener;
|
||||||
|
|
||||||
|
if (\is_string($listener)) {
|
||||||
|
unset($this->initialized[$event]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes an event listener from the specified events.
|
* {@inheritdoc}
|
||||||
*
|
|
||||||
* @param string|array $events
|
|
||||||
* @param object|string $listener
|
|
||||||
*/
|
*/
|
||||||
public function removeEventListener($events, $listener)
|
public function removeEventListener($events, $listener)
|
||||||
{
|
{
|
||||||
@ -138,4 +128,17 @@ class ContainerAwareEventManager extends EventManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $eventName
|
||||||
|
*/
|
||||||
|
private function initializeListeners($eventName)
|
||||||
|
{
|
||||||
|
foreach ($this->listeners[$eventName] as $hash => $listener) {
|
||||||
|
if (\is_string($listener)) {
|
||||||
|
$this->listeners[$eventName][$hash] = $this->container->get($listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->initialized[$eventName] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,8 +28,8 @@ class ContainerAwareEventManagerTest extends TestCase
|
|||||||
|
|
||||||
public function testDispatchEvent()
|
public function testDispatchEvent()
|
||||||
{
|
{
|
||||||
$this->container->set('foobar', $listener1 = new MyListener());
|
$this->container->set('lazy', $listener1 = new MyListener());
|
||||||
$this->evm->addEventListener('foo', 'foobar');
|
$this->evm->addEventListener('foo', 'lazy');
|
||||||
$this->evm->addEventListener('foo', $listener2 = new MyListener());
|
$this->evm->addEventListener('foo', $listener2 = new MyListener());
|
||||||
|
|
||||||
$this->evm->dispatchEvent('foo');
|
$this->evm->dispatchEvent('foo');
|
||||||
@ -38,19 +38,69 @@ class ContainerAwareEventManagerTest extends TestCase
|
|||||||
$this->assertTrue($listener2->called);
|
$this->assertTrue($listener2->called);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testAddEventListenerAfterDispatchEvent()
|
||||||
|
{
|
||||||
|
$this->container->set('lazy1', $listener1 = new MyListener());
|
||||||
|
$this->evm->addEventListener('foo', 'lazy1');
|
||||||
|
$this->evm->addEventListener('foo', $listener2 = new MyListener());
|
||||||
|
|
||||||
|
$this->evm->dispatchEvent('foo');
|
||||||
|
|
||||||
|
$this->container->set('lazy2', $listener3 = new MyListener());
|
||||||
|
$this->evm->addEventListener('foo', 'lazy2');
|
||||||
|
$this->evm->addEventListener('foo', $listener4 = new MyListener());
|
||||||
|
|
||||||
|
$this->evm->dispatchEvent('foo');
|
||||||
|
|
||||||
|
$this->assertTrue($listener1->called);
|
||||||
|
$this->assertTrue($listener2->called);
|
||||||
|
$this->assertTrue($listener3->called);
|
||||||
|
$this->assertTrue($listener4->called);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetListenersForEvent()
|
||||||
|
{
|
||||||
|
$this->container->set('lazy', $listener1 = new MyListener());
|
||||||
|
$this->evm->addEventListener('foo', 'lazy');
|
||||||
|
$this->evm->addEventListener('foo', $listener2 = new MyListener());
|
||||||
|
|
||||||
|
$this->assertSame([$listener1, $listener2], array_values($this->evm->getListeners('foo')));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetListeners()
|
||||||
|
{
|
||||||
|
$this->container->set('lazy', $listener1 = new MyListener());
|
||||||
|
$this->evm->addEventListener('foo', 'lazy');
|
||||||
|
$this->evm->addEventListener('foo', $listener2 = new MyListener());
|
||||||
|
|
||||||
|
$this->assertSame([$listener1, $listener2], array_values($this->evm->getListeners()['foo']));
|
||||||
|
}
|
||||||
|
|
||||||
public function testRemoveEventListener()
|
public function testRemoveEventListener()
|
||||||
{
|
{
|
||||||
$this->evm->addEventListener('foo', 'bar');
|
$this->container->set('lazy', $listener1 = new MyListener());
|
||||||
$this->evm->addEventListener('foo', $listener = new MyListener());
|
$this->evm->addEventListener('foo', 'lazy');
|
||||||
|
$this->evm->addEventListener('foo', $listener2 = new MyListener());
|
||||||
|
|
||||||
$listeners = ['foo' => ['_service_bar' => 'bar', spl_object_hash($listener) => $listener]];
|
$this->evm->removeEventListener('foo', $listener2);
|
||||||
$this->assertSame($listeners, $this->evm->getListeners());
|
$this->assertSame([$listener1], array_values($this->evm->getListeners('foo')));
|
||||||
$this->assertSame($listeners['foo'], $this->evm->getListeners('foo'));
|
|
||||||
|
|
||||||
$this->evm->removeEventListener('foo', $listener);
|
$this->evm->removeEventListener('foo', 'lazy');
|
||||||
$this->assertSame(['_service_bar' => 'bar'], $this->evm->getListeners('foo'));
|
$this->assertSame([], $this->evm->getListeners('foo'));
|
||||||
|
}
|
||||||
|
|
||||||
$this->evm->removeEventListener('foo', 'bar');
|
public function testRemoveEventListenerAfterDispatchEvent()
|
||||||
|
{
|
||||||
|
$this->container->set('lazy', $listener1 = new MyListener());
|
||||||
|
$this->evm->addEventListener('foo', 'lazy');
|
||||||
|
$this->evm->addEventListener('foo', $listener2 = new MyListener());
|
||||||
|
|
||||||
|
$this->evm->dispatchEvent('foo');
|
||||||
|
|
||||||
|
$this->evm->removeEventListener('foo', $listener2);
|
||||||
|
$this->assertSame([$listener1], array_values($this->evm->getListeners('foo')));
|
||||||
|
|
||||||
|
$this->evm->removeEventListener('foo', 'lazy');
|
||||||
$this->assertSame([], $this->evm->getListeners('foo'));
|
$this->assertSame([], $this->evm->getListeners('foo'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user