事件系统不保存监听器

时间:2015-03-06 16:02:57

标签: php events laravel domain-driven-design

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

0 个答案:

没有答案