Система событий не спасает слушателей

В последнее время я много читал об DDD и начал создавать домен для моего нового приложения. Я решил, что система событий должна быть частью моего собственного домена, а не использовать фреймворки, поэтому я свернул свою очень простую систему событий (ее сложность, очевидно, будет расти по мере роста приложения). Вот класс диспетчера:

class Dispatcher
{

private  $listeners = [];

public function assignListener($event, Listener $listener)
{
$this->listeners[$event][] = $listener;
}

public function fire($event)
{
$event_name = $this->getEventName($event);

$listeners = $this->getListeners($event_name);

foreach($listeners as $listener)
{
$listener->handle($event);
}
}

public function getEventName($event)
{
$event_name = get_class($event);

return str_replace('\\','.',$event_name);
}

public  function getListeners($event)
{
if( ! isset($this->listeners[$event])) return [];
return $this->listeners[$event];
}

как видите очень просто. Теперь я создал EventsServiceProvider:

 protected $listen = [
'TGL.Shop.Orders.Events.OrderWasPlaced' => [
'TGL\Shop\Orders\Listeners\SendAdminOrderWasPlacedEmail',
'TGL\Shop\Orders\Listeners\SendUserOrderWasPlacedEmail',
]
];

public function register()
{

}

/**
* @param Dispatcher $event
*/
public function boot(Dispatcher $event)
{
foreach($this->listen as $event_name => $listeners)
{
foreach($listeners as $listener)
{
$event->assignListener($event_name, new $listener);
}
}
}

теперь, если бы я умер и сбросил событие, находясь внутри EventServiceProvider, он вернул бы массив с двумя слушателями. Теперь я пытаюсь сделать то же самое за пределами поставщика услуг, и он возвращает пустой массив. Единственное, о чем я могу думать, это то, что это вызвано тем, что когда я вызываю его за пределами поставщика услуг, я получаю новый экземпляр класса, а у этого экземпляра нет прослушивателей. Как я могу обойти это или это не проблема?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]