Skip to content

Commit

Permalink
allow use Subscribers in ContainerEventListenerLocator and SymfonyCon…
Browse files Browse the repository at this point in the history
…tainerEventListenerLocator
  • Loading branch information
peter-gribanov committed Oct 2, 2017
1 parent 3a6fba7 commit e67e83a
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 57 deletions.
15 changes: 14 additions & 1 deletion src/Listener/Locator/ContainerEventListenerLocator.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,19 @@ public function registerService($event_name, $service, $method = '__invoke')
$this->listener_ids[$event_name][] = [$service, $method];
}

/**
* @param string $service_name
* @param string $class_name
*/
public function registerSubscriberService($service_name, $class_name)
{
foreach ($class_name::subscribedEvents() as $event_name => $methods) {
foreach ($methods as $method) {
$this->registerService($event_name, $service_name, $method);
}
}
}

/**
* @param string $event_name
*/
Expand All @@ -75,7 +88,7 @@ private function lazyLoad($event_name)
$listener = $this->resolve($this->container->get($service), $method);

if ($listener) {
$this->listeners[$event_name][$service] = $listener;
$this->listeners[$event_name][] = $listener;
}
}
}
Expand Down
21 changes: 17 additions & 4 deletions src/Listener/Locator/SymfonyContainerEventListenerLocator.php
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,25 @@ public function listenersOfEvent(Event $event)

/**
* @param string $event_name
* @param string $service
* @param string $service_name
* @param string $method
*/
public function registerService($event_name, $service, $method = '__invoke')
public function registerService($event_name, $service_name, $method = '__invoke')
{
$this->listener_ids[$event_name][] = [$service, $method];
$this->listener_ids[$event_name][] = [$service_name, $method];
}

/**
* @param string $service_name
* @param string $class_name
*/
public function registerSubscriberService($service_name, $class_name)
{
foreach ($class_name::subscribedEvents() as $event_name => $methods) {
foreach ($methods as $method) {
$this->registerService($event_name, $service_name, $method);
}
}
}

/**
Expand All @@ -66,7 +79,7 @@ private function lazyLoad($event_name)
$listener = $this->resolve($this->container->get($service), $method);

if ($listener) {
$this->listeners[$event_name][$service] = $listener;
$this->listeners[$event_name][] = $listener;
}
}
}
Expand Down
47 changes: 21 additions & 26 deletions tests/Listener/Locator/ContainerEventListenerLocatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@

use GpsLab\Domain\Event\Event;
use GpsLab\Domain\Event\Listener\Locator\ContainerEventListenerLocator;
use GpsLab\Domain\Event\Tests\Fixture\Listener\PurchaseOrderCompletedEventListener;
use GpsLab\Domain\Event\Tests\Fixture\Listener\PurchaseOrderCreatedEventListener;
use GpsLab\Domain\Event\Tests\Fixture\PurchaseOrderCompletedEvent;
use GpsLab\Domain\Event\Tests\Fixture\PurchaseOrderCreatedEvent;
use GpsLab\Domain\Event\Tests\Fixture\Subscriber\PurchaseOrderSubscriber;
use Psr\Container\ContainerInterface;

class ContainerEventListenerLocatorTest extends \PHPUnit_Framework_TestCase
Expand Down Expand Up @@ -85,35 +87,28 @@ public function testRegisterServiceIsNotAListener()
$this->assertEquals([], $this->locator->listenersOfEvent($event));
}

public function testOverrideListener()
public function testRegisterSubscriber()
{
/* @var $event Event */
$event = $this->getMock(Event::class);

$listener1 = function (Event $event) {
};
$this->locator->registerService(get_class($event), 'domain.listener');

$this->container
->expects($this->at(0))
->method('get')
->with('domain.listener')
->will($this->returnValue($listener1))
;

$listeners = $this->locator->listenersOfEvent($event);
$this->assertEquals([$listener1], $listeners);

$listener2 = new PurchaseOrderCompletedEventListener();
$this->locator->registerService(get_class($event), 'domain.listener', 'handle');

$subscriber = new PurchaseOrderSubscriber();
$this->locator->registerSubscriberService('domain.subscriber', PurchaseOrderSubscriber::class);
$this->container
->expects($this->at(1))
->expects($this->atLeastOnce())
->method('get')
->with('domain.listener')
->will($this->returnValue($listener2))
->with('domain.subscriber')
->will($this->returnValue($subscriber))
;

$this->assertEquals([[$listener2, 'handle']], $this->locator->listenersOfEvent($event));
$listeners = $this->locator->listenersOfEvent(new PurchaseOrderCompletedEvent());
$expected = [
[$subscriber, 'onCompleted1'],
[$subscriber, 'onCompleted2'],
];
$this->assertEquals($expected, $listeners);

$listeners = $this->locator->listenersOfEvent(new PurchaseOrderCreatedEvent());
$expected = [
[$subscriber, 'onCreated'],
];
$this->assertEquals($expected, $listeners);
}
}
47 changes: 21 additions & 26 deletions tests/Listener/Locator/SymfonyContainerEventListenerLocatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@

use GpsLab\Domain\Event\Event;
use GpsLab\Domain\Event\Listener\Locator\SymfonyContainerEventListenerLocator;
use GpsLab\Domain\Event\Tests\Fixture\Listener\PurchaseOrderCompletedEventListener;
use GpsLab\Domain\Event\Tests\Fixture\Listener\PurchaseOrderCreatedEventListener;
use GpsLab\Domain\Event\Tests\Fixture\PurchaseOrderCompletedEvent;
use GpsLab\Domain\Event\Tests\Fixture\PurchaseOrderCreatedEvent;
use GpsLab\Domain\Event\Tests\Fixture\Subscriber\PurchaseOrderSubscriber;
use Symfony\Component\DependencyInjection\ContainerInterface;

class SymfonyContainerEventListenerLocatorTest extends \PHPUnit_Framework_TestCase
Expand Down Expand Up @@ -96,37 +98,30 @@ public function testRegisterServiceIsNotAListener()
$this->assertEquals([], $this->locator->listenersOfEvent($event));
}

public function testOverrideListener()
public function testRegisterSubscriber()
{
$this->setContainer();

/* @var $event Event */
$event = $this->getMock(Event::class);

$listener1 = function (Event $event) {
};
$this->locator->registerService(get_class($event), 'domain.listener');

$this->container
->expects($this->at(0))
->method('get')
->with('domain.listener')
->will($this->returnValue($listener1))
;

$listeners = $this->locator->listenersOfEvent($event);
$this->assertEquals([$listener1], $listeners);

$listener2 = new PurchaseOrderCompletedEventListener();
$this->locator->registerService(get_class($event), 'domain.listener', 'handle');

$subscriber = new PurchaseOrderSubscriber();
$this->locator->registerSubscriberService('domain.subscriber', PurchaseOrderSubscriber::class);
$this->container
->expects($this->at(1))
->expects($this->atLeastOnce())
->method('get')
->with('domain.listener')
->will($this->returnValue($listener2))
->with('domain.subscriber')
->will($this->returnValue($subscriber))
;

$this->assertEquals([[$listener2, 'handle']], $this->locator->listenersOfEvent($event));
$listeners = $this->locator->listenersOfEvent(new PurchaseOrderCompletedEvent());
$expected = [
[$subscriber, 'onCompleted1'],
[$subscriber, 'onCompleted2'],
];
$this->assertEquals($expected, $listeners);

$listeners = $this->locator->listenersOfEvent(new PurchaseOrderCreatedEvent());
$expected = [
[$subscriber, 'onCreated'],
];
$this->assertEquals($expected, $listeners);
}
}

0 comments on commit e67e83a

Please sign in to comment.