В последнее время я много читал об 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, он вернул бы массив с двумя слушателями. Теперь я пытаюсь сделать то же самое за пределами поставщика услуг, и он возвращает пустой массив. Единственное, о чем я могу думать, это то, что это вызвано тем, что когда я вызываю его за пределами поставщика услуг, я получаю новый экземпляр класса, а у этого экземпляра нет прослушивателей. Как я могу обойти это или это не проблема?
Задача ещё не решена.
Других решений пока нет …