Automatická registrace EventSubscriberInterface

exquis
Člen | 82
+
0
-

Ahoj, snažím se o automatické přidání všech služeb, které implementují EventSubscriberInterface do EventManageru, abych to nemusel u každé dělat zvlášť. Zkoušel jsem to přes rozšíření:

	public function afterCompile(ClassType $classType)
	{
		/** @var ContainerBuilder $builder */
		$builder = $this->getContainerBuilder();

		/** @var EventManager $eventManager */
		$eventManager = $builder->findByType(EventManager::class);

		$subscribers = $builder->findByType(EventSubscriberInterface::class);

		foreach ($subscribers AS $subscriber) {
			$eventManager->addEventSubscriber($subscriber);
		}
	}

ale nechytá se, jediné co tak vypisuje chybu Call to a member function addEventSubscriber() on array

Tušíte prosím někdo jaký je správný postup?

Díky moc

Foowie
Člen | 269
+
0
-

Odhaduju podle chybové hlášky, že ti $eventManager = $builder->findByType(EventManager::class); vrátí pole s objekty typu EventManager. Musíš překontrolvat že toto pole není prázdné a vybrat si z toho pole objekt který potřebuješ.

Tomáš Votruba
Moderator | 1114
+
0
-

Ahoj, můžeš zkopírovat tuto integraci do Nette:

public function beforeCompile(): void
{
    $containerBuilder = $this->getContainerBuilder();

    $dispatcherDefinition = $containerBuilder->getDefinitionByType(EventDispatcherInterface::class);
    $subscriberDefinitions = $containerBuilder->findByType(EventSubscriberInterface::class);

    foreach ($subscriberDefinitions as $name => $definition) {
        $dispatcherDefinition->addSetup('addSubscriber', [$name]);
    }
}

Editoval Tomáš Votruba (11. 5. 2017 14:05)

exquis
Člen | 82
+
0
-

Ahoj, tak bohužel ani tohle nefunguje, dostanu se do fáze, kdy píše Call to undefined method Nette\DI\ServiceDefinition::addSubscriber(), nicméně přemýšlím, že zkusím použít celý balíček Symplify/SymfonyEventDispatcher, což by vyřešilo většinu problému :) díky moc

Tomáš Votruba napsal(a):

Ahoj, můžeš zkopírovat tuto integraci do Nette:

public function beforeCompile(): void
{
    $containerBuilder = $this->getContainerBuilder();

    $dispatcherDefinition = $containerBuilder->getDefinitionByType(EventDispatcherInterface::class);
    $subscriberDefinitions = $containerBuilder->findByType(EventSubscriberInterface::class);

    foreach ($subscriberDefinitions as $name => $definition) {
        $dispatcherDefinition->addEventSubscriber($name);
    }
}
Felix
Nette Core | 1189
+
+2
-

@exquis Muzes pripadne vyzkouset jeste contributte/event-dispatcher

jiri.pudil
Nette Blogger | 1028
+
+4
-

Ono totiž ServiceDefinition opravdu nemá metodu addSubscriber :) potřebuješ to nastavit jako setup:

foreach ($subscriberDefinitions as $definition) {
	$dispatcherDefinition->addSetup('addSubscriber', [$definition]);
}
exquis
Člen | 82
+
0
-

Moc dekuju, rozbehlo se to podle ocekavani, presne neco takoveho jsem hledal

jiri.pudil napsal(a):

Ono totiž ServiceDefinition opravdu nemá metodu addSubscriber :) potřebuješ to nastavit jako setup:

foreach ($subscriberDefinitions as $definition) {
	$dispatcherDefinition->addSetup('addSubscriber', [$definition]);
}
Tomáš Votruba
Moderator | 1114
+
+2
-

@exquis Díky za info. Fixed, nevšmil jsem si chyby v tom původním příkladu.