Automatická registrace EventSubscriberInterface

- exquis
- Člen | 83
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

- Tomáš Votruba
- Moderator | 1114
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 | 83
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); } }

- jiri.pudil
- Nette Blogger | 1034
Ono totiž ServiceDefinition opravdu nemá metodu
addSubscriber :) potřebuješ to nastavit jako setup:
foreach ($subscriberDefinitions as $definition) {
$dispatcherDefinition->addSetup('addSubscriber', [$definition]);
}

- exquis
- Člen | 83
Moc dekuju, rozbehlo se to podle ocekavani, presne neco takoveho jsem hledal
jiri.pudil napsal(a):
Ono totiž
ServiceDefinitionopravdu nemá metoduaddSubscriber:) potřebuješ to nastavit jako setup:foreach ($subscriberDefinitions as $definition) { $dispatcherDefinition->addSetup('addSubscriber', [$definition]); }

- Tomáš Votruba
- Moderator | 1114
@exquis Díky za info. Fixed, nevšmil jsem si chyby v tom původním příkladu.