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 | 1032
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ž
ServiceDefinition
opravdu 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.