所以我最近读了很多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内部转储事件,它将返回一个包含2个侦听器的数组。现在我尝试在服务提供者外面做同样的事情,它返回一个空数组。我唯一能想到的是导致这种情况,当我在服务提供者之外调用它时,我得到的是该类的新实例,并且该实例没有监听器。我该如何解决这个问题还是不是问题?