[ticket/12016] Use a service provider for event listeners

This allows them to use dependency injection

PHPBB3-12016
This commit is contained in:
Joas Schilling 2013-11-13 17:34:06 +01:00
parent cfb0a41030
commit d3f9a51709
2 changed files with 16 additions and 13 deletions

View file

@ -140,10 +140,17 @@ services:
class: phpbb\event\extension_subscriber_loader class: phpbb\event\extension_subscriber_loader
arguments: arguments:
- @dispatcher - @dispatcher
- @ext.manager - @event.listener_collection
calls: calls:
- [load, []] - [load, []]
event.listener_collection:
class: phpbb\di\service_collection
arguments:
- @service_container
tags:
- { name: service_collection, tag: event.listener }
ext.manager: ext.manager:
class: phpbb\extension\manager class: phpbb\extension\manager
arguments: arguments:

View file

@ -14,26 +14,22 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class extension_subscriber_loader class extension_subscriber_loader
{ {
private $dispatcher; private $dispatcher;
private $extension_manager; private $listener_collection;
public function __construct(EventDispatcherInterface $dispatcher, \phpbb\extension\manager $extension_manager) public function __construct(EventDispatcherInterface $dispatcher, \phpbb\di\service_collection $listener_collection)
{ {
$this->dispatcher = $dispatcher; $this->dispatcher = $dispatcher;
$this->extension_manager = $extension_manager; $this->listener_collection = $listener_collection;
} }
public function load() public function load()
{ {
$finder = $this->extension_manager->get_finder(); if (!empty($this->listener_collection))
$subscriber_classes = $finder
->extension_directory('/event')
->core_path('event/')
->get_classes();
foreach ($subscriber_classes as $class)
{ {
$subscriber = new $class(); foreach ($this->listener_collection as $listener)
$this->dispatcher->addSubscriber($subscriber); {
$this->dispatcher->addSubscriber($listener);
}
} }
} }
} }