public function testRemoveSubscriberWithMultipleListeners() { $eventSubscriber = new TestEventSubscriberWithMultipleListeners(); $this->dispatcher->addSubscriber($eventSubscriber); $this->assertTrue($this->dispatcher->hasListeners(self::preFoo)); $this->assertCount(2, $this->dispatcher->getListeners(self::preFoo)); $this->dispatcher->removeSubscriber($eventSubscriber); $this->assertFalse($this->dispatcher->hasListeners(self::preFoo)); }
private function registerListeners() { $reg = $this->service->getExtensionRegistry(); $listeners = $reg->getExtensions(CoreModule::EXT_LISTENER); $map = new Map(); $getClass = function ($className) use($map) { if (class_exists($className)) { if ($map->has($className)) { $class = $map->get($className); } else { $class = new $className(); $map->set($className, $class); } if ($class instanceof KeekoEventListenerInterface) { $class->setServiceContainer($this->service); } return $class; } return null; }; foreach ($listeners as $listener) { // subscriber first if (isset($listener['subscriber'])) { $className = $listener['subscriber']; $subscriber = $getClass($className); if ($subscriber !== null && $subscriber instanceof KeekoEventSubscriberInterface) { $this->dispatcher->addSubscriber($subscriber); } } // class if (isset($listener['class']) && isset($listener['method']) && isset($listener['event'])) { $className = $listener['class']; $class = $getClass($className); if ($class !== null && $class instanceof KeekoEventListenerInterface && method_exists($class, $listener['method'])) { $this->dispatcher->addListener($listener['event'], [$class, $listener['method']]); } } } }