Przeglądaj źródła

fixed event dispatcher

Fabien Potencier 14 lat temu
rodzic
commit
49793c22d4

+ 16 - 0
src/Symfony/Bundle/FrameworkBundle/Debug/EventDispatcher.php

@@ -48,6 +48,10 @@ class EventDispatcher extends BaseEventDispatcher implements EventDispatcherTrac
     public function notify(Event $event)
     {
         foreach ($this->getListeners($event->getName()) as $listener) {
+            if (is_array($listener) && is_string($listener[0])) {
+                $listener[0] = $this->container->get($listener[0]);
+            }
+
             $this->addCall($event, $listener, 'notify');
 
             call_user_func($listener, $event);
@@ -62,6 +66,10 @@ class EventDispatcher extends BaseEventDispatcher implements EventDispatcherTrac
     public function notifyUntil(Event $event)
     {
         foreach ($this->getListeners($event->getName()) as $i => $listener) {
+            if (is_array($listener) && is_string($listener[0])) {
+                $listener[0] = $this->container->get($listener[0]);
+            }
+
             $this->addCall($event, $listener, 'notifyUntil');
 
             if (call_user_func($listener, $event)) {
@@ -88,6 +96,10 @@ class EventDispatcher extends BaseEventDispatcher implements EventDispatcherTrac
     public function filter(Event $event, $value)
     {
         foreach ($this->getListeners($event->getName()) as $listener) {
+            if (is_array($listener) && is_string($listener[0])) {
+                $listener[0] = $this->container->get($listener[0]);
+            }
+
             $this->addCall($event, $listener, 'filter');
 
             $value = call_user_func($listener, $event, $value);
@@ -115,6 +127,10 @@ class EventDispatcher extends BaseEventDispatcher implements EventDispatcherTrac
 
         foreach (array_keys($this->listeners) as $name) {
             foreach ($this->getListeners($name) as $listener) {
+                if (is_array($listener) && is_string($listener[0])) {
+                    $listener[0] = $this->container->get($listener[0]);
+                }
+
                 $listener = $this->listenerToString($listener);
 
                 if (!isset($this->called[$name.'.'.$listener])) {

+ 1 - 1
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Compiler/RegisterKernelListenersPass.php

@@ -41,7 +41,7 @@ class RegisterKernelListenersPass implements CompilerPassInterface
                     $listeners[$event['event']][$priority] = array();
                 }
 
-                $listeners[$event['event']][$priority][$id] = $event['method'];
+                $listeners[$event['event']][$priority][] = array($id, $event['method']);
             }
         }
 

+ 42 - 13
src/Symfony/Bundle/FrameworkBundle/EventDispatcher.php

@@ -13,6 +13,7 @@ namespace Symfony\Bundle\FrameworkBundle;
 
 use Symfony\Component\EventDispatcher\EventDispatcher as BaseEventDispatcher;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\EventDispatcher\Event;
 
 /**
  * This EventDispatcher automatically gets the kernel listeners injected
@@ -22,7 +23,6 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 class EventDispatcher extends BaseEventDispatcher
 {
     protected $container;
-    protected $ids;
 
     /**
      * Constructor.
@@ -34,29 +34,58 @@ class EventDispatcher extends BaseEventDispatcher
         $this->container = $container;
     }
 
-    public function registerKernelListeners(array $ids)
+    public function registerKernelListeners(array $listeners)
     {
-        $this->ids = $ids;
+        $this->listeners = $listeners;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function getListeners($name)
+    public function notify(Event $event)
     {
-        if (!isset($this->ids[$name])) {
-            return array();
+        foreach ($this->getListeners($event->getName()) as $listener) {
+            if (is_array($listener) && is_string($listener[0])) {
+                $listener[0] = $this->container->get($listener[0]);
+            }
+            call_user_func($listener, $event);
+        }
+
+        return $event;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function notifyUntil(Event $event)
+    {
+        foreach ($this->getListeners($event->getName()) as $listener) {
+            if (is_array($listener) && is_string($listener[0])) {
+                $listener[0] = $this->container->get($listener[0]);
+            }
+            if (call_user_func($listener, $event)) {
+                $event->setProcessed(true);
+                break;
+            }
         }
 
-        $listeners = array();
-        $all = $this->ids[$name];
-        krsort($all);
-        foreach ($all as $l) {
-            foreach ($l as $id => $method) {
-                $listeners[] = array($this->container->get($id), $method);
+        return $event;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function filter(Event $event, $value)
+    {
+        foreach ($this->getListeners($event->getName()) as $listener) {
+            if (is_array($listener) && is_string($listener[0])) {
+                $listener[0] = $this->container->get($listener[0]);
             }
+            $value = call_user_func($listener, $event, $value);
         }
 
-        return $listeners;
+        $event->setReturnValue($value);
+
+        return $event;
     }
 }

+ 2 - 1
src/Symfony/Component/EventDispatcher/EventDispatcher.php

@@ -48,12 +48,13 @@ class EventDispatcher
      *
      * @param string $name An event name
      * @param mixed|null $listener the listener to remove, or null to remove all
+     *
      * @return void
      */
     public function disconnect($name, $listener = null)
     {
         if (!isset($this->listeners[$name])) {
-            return false;
+            return;
         }
 
         if (null === $listener) {