Я использую компонент EventDispatcher Symfony для запуска и обработки событий в моем приложении. Я создал глобальную вспомогательную функцию fire(Event $event)
внутри файла Helpers.php, которую я автоматически загружаю с помощью composer.
Помощники.php
<?php
use App\Http\Helpers\ConfigManager;
use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\EventDispatcher\EventDispatcher;
//listeners array defined in another file.
$listeners = [
[\App\Events\ExampleEvent::class => \App\Listeners\ExampleListener::class],
[\App\Events\JobEvent::class => \App\Listeners\JobEventListener::class]
];
if (!function_exists('fire')) {
function fire(Event $event) {
$dispatcher = new EventDispatcher();
$listeners = ConfigManager::getInstance()->getEventListeners();
foreach ($listeners as $listener) {
foreach ($listener as $ev => $handler) {
$instance = new $handler;
if (method_exists($instance, 'handle')) {
$dispatcher->addListener($ev, [$instance, 'handle']);
}
}
}
//events should be dispatched once
//remove duplicate events name from events array.
$events = array_unique(
array_map(function ($listener) {
return array_keys($listener)[0];
}, $listeners)
);
foreach ($events as $ev) {
if ($event instanceof $ev) {
$dispatcher->dispatch($ev, $event);
}
}
}
}
Я использую это так: fire(new ExampleEvent('payload'));
Эта функция доступна везде в моем приложении. Каждый раз, когда я вызываю ее, EventListeners в массиве $ listeners регистрируются, затемотправляется событие $.
Проблема в том, что я не уверен, является ли это лучшим способом регистрации и отправки событий, потому что для каждого вызова этой функции слушатели должны быть зарегистрированы перед отправкой события.
Должен ли я зарегистрировать слушателей где-то еще, а затем просто запустить событие внутри функции, какие-нибудь идеи?
PS.Я не использую какие-либо рамки.