Skip to content

Commit

Permalink
refactored the listeners management
Browse files Browse the repository at this point in the history
  • Loading branch information
fabpot committed May 19, 2010
1 parent 3fe83cd commit 8c4dd5c
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 90 deletions.
@@ -1,6 +1,6 @@
<?php

namespace Symfony\Framework\WebBundle\Listener;
namespace Symfony\Components\HttpKernel\Listener;

use Symfony\Components\EventDispatcher\EventDispatcher;
use Symfony\Components\EventDispatcher\Event;
Expand All @@ -26,18 +26,22 @@
*/
class ResponseFilter
{
protected $dispatcher;

public function __construct(EventDispatcher $dispatcher)
{
$this->dispatcher = $dispatcher;
}

public function register()
/**
* Registers a core.response listener to change the Content-Type header based on the Request format.
*
* @param Symfony\Components\EventDispatcher\EventDispatcher $dispatcher An EventDispatcher instance
*/
public function register(EventDispatcher $dispatcher)
{
$this->dispatcher->connect('core.response', array($this, 'filter'));
$dispatcher->connect('core.response', array($this, 'filter'));
}

/**
* Filters the Response.
*
* @param Symfony\Components\EventDispatcher\Event $event An Event instance
* @param Symfony\Components\HttpKernel\Response $response A Response instance
*/
public function filter(Event $event, Response $response)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getParameter('request_type') || $response->headers->has('Content-Type')) {
Expand Down
35 changes: 2 additions & 33 deletions src/Symfony/Foundation/EventDispatcher.php
Expand Up @@ -16,53 +16,22 @@
*/

/**
* This EventDispatcher implementation uses a DependencyInjection container to
* lazy load listeners.
* This EventDispatcher implementation uses a DependencyInjection container to load listeners.
*
* @package Symfony
* @subpackage Foundation
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
*/
class EventDispatcher extends BaseEventDispatcher
{
protected $container;

/**
* Constructor.
*
*/
public function __construct(ContainerInterface $container)
{
$this->container = $container;

foreach ($container->findAnnotatedServiceIds('kernel.listener') as $id => $attributes) {
foreach ($attributes as $attribute) {
if (isset($attribute['event'])) {
$this->connect($attribute['event'], array($id, isset($attribute['method']) ? $attribute['method'] : 'handle'));
}
}
$container->getService($id)->register($this);
}
}

/**
* Returns all listeners associated with a given event name.
*
* @param string $name The event name
*
* @return array An array of listeners
*/
public function getListeners($name)
{
if (!isset($this->listeners[$name])) {
return array();
}

foreach ($this->listeners[$name] as $i => $listener) {
if (is_array($listener) && is_string($listener[0])) {
$this->listeners[$name][$i] = array($this->container->getService($listener[0]), $listener[1]);
}
}

return $this->listeners[$name];
}
}
26 changes: 1 addition & 25 deletions src/Symfony/Foundation/bootstrap.php
Expand Up @@ -338,35 +338,11 @@ static protected function writeCacheFile($file, $content)

class EventDispatcher extends BaseEventDispatcher
{
protected $container;


public function __construct(ContainerInterface $container)
{
$this->container = $container;

foreach ($container->findAnnotatedServiceIds('kernel.listener') as $id => $attributes) {
foreach ($attributes as $attribute) {
if (isset($attribute['event'])) {
$this->connect($attribute['event'], array($id, isset($attribute['method']) ? $attribute['method'] : 'handle'));
}
}
$container->getService($id)->register($this);
}
}


public function getListeners($name)
{
if (!isset($this->listeners[$name])) {
return array();
}

foreach ($this->listeners[$name] as $i => $listener) {
if (is_array($listener) && is_string($listener[0])) {
$this->listeners[$name][$i] = array($this->container->getService($listener[0]), $listener[1]);
}
}

return $this->listeners[$name];
}
}
Expand Up @@ -3,6 +3,7 @@
namespace Symfony\Framework\ProfilerBundle\DataCollector;

use Symfony\Components\DependencyInjection\ContainerInterface;
use Symfony\Components\EventDispatcher\EventDispatcher;
use Symfony\Components\EventDispatcher\Event;
use Symfony\Components\HttpKernel\Response;
use Symfony\Components\HttpKernel\HttpKernelInterface;
Expand Down Expand Up @@ -43,9 +44,14 @@ public function __construct(ContainerInterface $container, LoggerInterface $logg
$this->collectors = $this->initCollectors();
}

public function register()
/**
* Registers a core.response listener.
*
* @param Symfony\Components\EventDispatcher\EventDispatcher $dispatcher An EventDispatcher instance
*/
public function register(EventDispatcher $dispatcher)
{
$this->container->getEventDispatcherService()->connect('core.response', array($this, 'handle'));
$dispatcher->connect('core.response', array($this, 'handle'));
}

public function handle(Event $event, Response $response)
Expand Down
Expand Up @@ -3,6 +3,7 @@
namespace Symfony\Framework\ProfilerBundle\Listener;

use Symfony\Components\DependencyInjection\ContainerInterface;
use Symfony\Components\EventDispatcher\EventDispatcher;
use Symfony\Components\EventDispatcher\Event;
use Symfony\Components\HttpKernel\Response;
use Symfony\Components\HttpKernel\HttpKernelInterface;
Expand Down Expand Up @@ -35,9 +36,14 @@ public function __construct(ContainerInterface $container, DataCollectorManager
$this->collectorManager = $collectorManager;
}

public function register()
/**
* Registers a core.response listener.
*
* @param Symfony\Components\EventDispatcher\EventDispatcher $dispatcher An EventDispatcher instance
*/
public function register(EventDispatcher $dispatcher)
{
$this->container->getEventDispatcherService()->connect('core.response', array($this, 'handle'));
$dispatcher->connect('core.response', array($this, 'handle'));
}

public function handle(Event $event, Response $response)
Expand Down
Expand Up @@ -17,7 +17,7 @@

<services>
<service id="data_collector_manager" class="%data_collector_manager.class%">
<annotation name="kernel.listener" event="core.response" method="handle" />
<annotation name="kernel.listener" />
<argument type="service" id="service_container" />
<argument type="service" id="logger" />
<argument type="service" id="data_collector_manager.storage" />
Expand Down
Expand Up @@ -10,7 +10,7 @@

<services>
<service id="debug.toolbar" class="%debug.toolbar.class%">
<annotation name="kernel.listener" event="core.response" method="handle" />
<annotation name="kernel.listener" />
<argument type="service" id="service_container" />
<argument type="service" id="data_collector_manager" />
</service>
Expand Down
13 changes: 8 additions & 5 deletions src/Symfony/Framework/WebBundle/Listener/ControllerLoader.php
Expand Up @@ -27,19 +27,22 @@
class ControllerLoader
{
protected $manager;
protected $dispatcher;
protected $logger;

public function __construct(EventDispatcher $dispatcher, ControllerManager $manager, LoggerInterface $logger = null)
public function __construct(ControllerManager $manager, LoggerInterface $logger = null)
{
$this->dispatcher = $dispatcher;
$this->manager = $manager;
$this->logger = $logger;
}

public function register()
/**
* Registers a core.load_controller listener.
*
* @param Symfony\Components\EventDispatcher\EventDispatcher $dispatcher An EventDispatcher instance
*/
public function register(EventDispatcher $dispatcher)
{
$this->dispatcher->connect('core.load_controller', array($this, 'resolve'));
$dispatcher->connect('core.load_controller', array($this, 'resolve'));
}

/**
Expand Down
10 changes: 8 additions & 2 deletions src/Symfony/Framework/WebBundle/Listener/ExceptionHandler.php
Expand Up @@ -3,6 +3,7 @@
namespace Symfony\Framework\WebBundle\Listener;

use Symfony\Components\DependencyInjection\ContainerInterface;
use Symfony\Components\EventDispatcher\EventDispatcher;
use Symfony\Components\EventDispatcher\Event;
use Symfony\Foundation\LoggerInterface;
use Symfony\Components\HttpKernel\HttpKernelInterface;
Expand Down Expand Up @@ -37,9 +38,14 @@ public function __construct(ContainerInterface $container, LoggerInterface $logg
$this->controller = $controller;
}

public function register()
/**
* Registers a core.exception listener.
*
* @param Symfony\Components\EventDispatcher\EventDispatcher $dispatcher An EventDispatcher instance
*/
public function register(EventDispatcher $dispatcher)
{
$this->container->getEventDispatcherService()->connect('core.exception', array($this, 'handle'));
$dispatcher->connect('core.exception', array($this, 'handle'));
}

public function handle(Event $event)
Expand Down
10 changes: 8 additions & 2 deletions src/Symfony/Framework/WebBundle/Listener/RequestParser.php
Expand Up @@ -4,6 +4,7 @@

use Symfony\Foundation\LoggerInterface;
use Symfony\Components\DependencyInjection\ContainerInterface;
use Symfony\Components\EventDispatcher\EventDispatcher;
use Symfony\Components\EventDispatcher\Event;
use Symfony\Components\Routing\RouterInterface;
use Symfony\Components\HttpKernel\HttpKernelInterface;
Expand Down Expand Up @@ -37,9 +38,14 @@ public function __construct(ContainerInterface $container, RouterInterface $rout
$this->logger = $logger;
}

public function register()
/**
* Registers a core.request listener.
*
* @param Symfony\Components\EventDispatcher\EventDispatcher $dispatcher An EventDispatcher instance
*/
public function register(EventDispatcher $dispatcher)
{
$this->container->getEventDispatcherService()->connect('core.request', array($this, 'resolve'));
$dispatcher->connect('core.request', array($this, 'resolve'));
}

public function resolve(Event $event)
Expand Down
12 changes: 5 additions & 7 deletions src/Symfony/Framework/WebBundle/Resources/config/web.xml
Expand Up @@ -9,7 +9,7 @@
<parameter key="controller_manager.class">Symfony\Framework\WebBundle\Controller\ControllerManager</parameter>
<parameter key="controller_loader.class">Symfony\Framework\WebBundle\Listener\ControllerLoader</parameter>
<parameter key="router.class">Symfony\Components\Routing\Router</parameter>
<parameter key="response_filter.class">Symfony\Framework\WebBundle\Listener\ResponseFilter</parameter>
<parameter key="response_filter.class">Symfony\Components\HttpKernel\Listener\ResponseFilter</parameter>

<parameter key="exception_handler.class">Symfony\Framework\WebBundle\Listener\ExceptionHandler</parameter>
<parameter key="exception_handler.bundle">WebBundle</parameter>
Expand All @@ -24,14 +24,13 @@
</service>

<service id="controller_loader" class="%controller_loader.class%">
<annotation name="kernel.listener" event="core.load_controller" method="resolve" />
<argument type="service" id="event_dispatcher" />
<annotation name="kernel.listener" />
<argument type="service" id="controller_manager" />
<argument type="service" id="logger" on-invalid="ignore" />
</service>

<service id="request_parser" class="%request_parser.class%">
<annotation name="kernel.listener" event="core.request" method="resolve" />
<annotation name="kernel.listener" />
<argument type="service" id="service_container" />
<argument type="service" id="router" />
<argument type="service" id="logger" on-invalid="ignore" />
Expand All @@ -51,12 +50,11 @@
</service>

<service id="response_filter" class="%response_filter.class%">
<annotation name="kernel.listener" event="core.response" method="filter" />
<argument type="service" id="event_dispatcher" />
<annotation name="kernel.listener" />
</service>

<service id="exception_handler" class="%exception_handler.class%">
<annotation name="kernel.listener" event="core.exception" method="handle" />
<annotation name="kernel.listener" />
<argument type="service" id="service_container" />
<argument type="service" id="logger" on-invalid="null" />
<argument>%exception_handler.bundle%</argument>
Expand Down

0 comments on commit 8c4dd5c

Please sign in to comment.