From 82ff79064acc336ce284a3914070479a0fe346ef Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Thu, 26 Aug 2010 14:08:42 +0200 Subject: [PATCH] added a priority to the event dispatcher listeners --- .../Debug/ExceptionListener.php | 5 +-- .../FrameworkBundle/RequestListener.php | 5 +-- .../FrameworkBundle/Resources/config/web.xml | 2 +- .../EventDispatcher/EventDispatcher.php | 32 +++++++++++-------- .../HttpKernel/Cache/EsiListener.php | 5 +-- .../HttpKernel/Profiler/ProfilerListener.php | 5 +-- .../Profiler/WebDebugToolbarListener.php | 5 +-- .../Component/HttpKernel/ResponseListener.php | 5 +-- src/Symfony/Framework/EventDispatcher.php | 4 ++- 9 files changed, 41 insertions(+), 27 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/Debug/ExceptionListener.php b/src/Symfony/Bundle/FrameworkBundle/Debug/ExceptionListener.php index c1480e56ec..7348dabc35 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Debug/ExceptionListener.php +++ b/src/Symfony/Bundle/FrameworkBundle/Debug/ExceptionListener.php @@ -39,10 +39,11 @@ class ExceptionListener * Registers a core.exception listener. * * @param EventDispatcher $dispatcher An EventDispatcher instance + * @param integer $priority The priority */ - public function register(EventDispatcher $dispatcher) + public function register(EventDispatcher $dispatcher, $priority = 0) { - $dispatcher->connect('core.exception', array($this, 'handle')); + $dispatcher->connect('core.exception', array($this, 'handle'), $priority); } public function handle(Event $event) diff --git a/src/Symfony/Bundle/FrameworkBundle/RequestListener.php b/src/Symfony/Bundle/FrameworkBundle/RequestListener.php index 5761684fe7..556e20644b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/RequestListener.php +++ b/src/Symfony/Bundle/FrameworkBundle/RequestListener.php @@ -37,10 +37,11 @@ class RequestListener * Registers a core.request listener. * * @param EventDispatcher $dispatcher An EventDispatcher instance + * @param integer $priority The priority */ - public function register(EventDispatcher $dispatcher) + public function register(EventDispatcher $dispatcher, $priority = 0) { - $dispatcher->connect('core.request', array($this, 'resolve')); + $dispatcher->connect('core.request', array($this, 'resolve'), $priority); } public function resolve(Event $event) diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml index fac356533b..7e202eaa5f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml @@ -46,7 +46,7 @@ - + %exception_listener.controller% diff --git a/src/Symfony/Component/EventDispatcher/EventDispatcher.php b/src/Symfony/Component/EventDispatcher/EventDispatcher.php index ecce2fce4e..8a7c8590a1 100644 --- a/src/Symfony/Component/EventDispatcher/EventDispatcher.php +++ b/src/Symfony/Component/EventDispatcher/EventDispatcher.php @@ -26,14 +26,15 @@ class EventDispatcher * * @param string $name An event name * @param mixed $listener A PHP callable + * @param integer $priority The priority (between -10 and 10 -- defaults to 0) */ - public function connect($name, $listener) + public function connect($name, $listener, $priority = 0) { - if (!isset($this->listeners[$name])) { - $this->listeners[$name] = array(); + if (!isset($this->listeners[$name][$priority])) { + $this->listeners[$name][$priority] = array(); } - $this->listeners[$name][] = $listener; + $this->listeners[$name][$priority][] = $listener; } /** @@ -50,9 +51,11 @@ class EventDispatcher return false; } - foreach ($this->listeners[$name] as $i => $callable) { - if ($listener === $callable) { - unset($this->listeners[$name][$i]); + foreach ($this->listeners[$name] as $priority => $callables) { + foreach ($callables as $i => $callable) { + if ($listener === $callable) { + unset($this->listeners[$name][$priority][$i]); + } } } } @@ -120,11 +123,7 @@ class EventDispatcher */ public function hasListeners($name) { - if (!isset($this->listeners[$name])) { - $this->listeners[$name] = array(); - } - - return (boolean) count($this->listeners[$name]); + return (Boolean) count($this->getListeners($name)); } /** @@ -140,6 +139,13 @@ class EventDispatcher return array(); } - return $this->listeners[$name]; + $listeners = array(); + $all = $this->listeners[$name]; + ksort($all); + foreach ($all as $l) { + $listeners = array_merge($listeners, $l); + } + + return $listeners; } } diff --git a/src/Symfony/Component/HttpKernel/Cache/EsiListener.php b/src/Symfony/Component/HttpKernel/Cache/EsiListener.php index 9e19dbf036..fac4aea02a 100644 --- a/src/Symfony/Component/HttpKernel/Cache/EsiListener.php +++ b/src/Symfony/Component/HttpKernel/Cache/EsiListener.php @@ -39,12 +39,13 @@ class EsiListener * Registers a core.response listener to add the Surrogate-Control header to a Response when needed. * * @param EventDispatcher $dispatcher An EventDispatcher instance + * @param integer $priority The priority */ - public function register(EventDispatcher $dispatcher) + public function register(EventDispatcher $dispatcher, $priority = 0) { if (null !== $this->esi) { - $dispatcher->connect('core.response', array($this, 'filter')); + $dispatcher->connect('core.response', array($this, 'filter'), $priority); } } diff --git a/src/Symfony/Component/HttpKernel/Profiler/ProfilerListener.php b/src/Symfony/Component/HttpKernel/Profiler/ProfilerListener.php index 52018a728f..850d0563ca 100644 --- a/src/Symfony/Component/HttpKernel/Profiler/ProfilerListener.php +++ b/src/Symfony/Component/HttpKernel/Profiler/ProfilerListener.php @@ -34,10 +34,11 @@ class ProfilerListener * Registers a core.response listener. * * @param EventDispatcher $dispatcher An EventDispatcher instance + * @param integer $priority The priority */ - public function register(EventDispatcher $dispatcher) + public function register(EventDispatcher $dispatcher, $priority = 0) { - $dispatcher->connect('core.response', array($this, 'handle')); + $dispatcher->connect('core.response', array($this, 'handle'), $priority); } public function handle(Event $event, Response $response) diff --git a/src/Symfony/Component/HttpKernel/Profiler/WebDebugToolbarListener.php b/src/Symfony/Component/HttpKernel/Profiler/WebDebugToolbarListener.php index 328e6c80ce..a94e008735 100644 --- a/src/Symfony/Component/HttpKernel/Profiler/WebDebugToolbarListener.php +++ b/src/Symfony/Component/HttpKernel/Profiler/WebDebugToolbarListener.php @@ -35,10 +35,11 @@ class WebDebugToolbarListener * Registers a core.response listener. * * @param EventDispatcher $dispatcher An EventDispatcher instance + * @param integer $priority The priority */ - public function register(EventDispatcher $dispatcher) + public function register(EventDispatcher $dispatcher, $priority = 0) { - $dispatcher->connect('core.response', array($this, 'handle')); + $dispatcher->connect('core.response', array($this, 'handle'), $priority); } public function handle(Event $event, Response $response) diff --git a/src/Symfony/Component/HttpKernel/ResponseListener.php b/src/Symfony/Component/HttpKernel/ResponseListener.php index c50b2ddf42..5f9c5a065f 100644 --- a/src/Symfony/Component/HttpKernel/ResponseListener.php +++ b/src/Symfony/Component/HttpKernel/ResponseListener.php @@ -26,10 +26,11 @@ class ResponseListener * Registers a core.response listener to change the Content-Type header based on the Request format. * * @param EventDispatcher $dispatcher An EventDispatcher instance + * @param integer $priority The priority */ - public function register(EventDispatcher $dispatcher) + public function register(EventDispatcher $dispatcher, $priority = 0) { - $dispatcher->connect('core.response', array($this, 'filter')); + $dispatcher->connect('core.response', array($this, 'filter'), $priority); } /** diff --git a/src/Symfony/Framework/EventDispatcher.php b/src/Symfony/Framework/EventDispatcher.php index b687a16d35..9b336be73a 100644 --- a/src/Symfony/Framework/EventDispatcher.php +++ b/src/Symfony/Framework/EventDispatcher.php @@ -29,7 +29,9 @@ class EventDispatcher extends BaseEventDispatcher public function __construct(ContainerInterface $container) { foreach ($container->findTaggedServiceIds('kernel.listener') as $id => $attributes) { - $container->get($id)->register($this); + $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0; + + $container->get($id)->register($this, $priority); } } }