在模型构造函数中注入Dispatcher时,Laravel事件不会触发

时间:2014-12-03 11:52:38

标签: php events laravel constructor inversion-of-control

我正在尝试从工匠命令中将Laravel事件调度程序注入到我的模型的构造函数中,但是我无法从此依赖项中触发订阅的事件。

看起来Laravel会注入一个新的Illuminate \ Events \ Dispatcher实例,而不是重新使用Application调度程序。我跟随了Jeff Way的Laracast视频进行实施。

我在app / start / global.php中添加了:

  

需要app_path()。 ' /events.php' ;;

这引用了一个名为events.php的文件,其中包含:

  

事件::订阅(' MyApp的\事件\处理程序\一个MyEventHandler&#39);

events.php文件有一个订阅方法,其中包含3个相应的事件方法,如下所示:

public function subscribe($events)
{
        $events->listen('event.start', 'MyApp\event\Handlers\MyEventHandler@onStart');
        $events->listen('event.error', 'MyApp\event\Handlers\MyEventHandler@onError');
        $events->listen('event.complete', 'MyApp\event\Handlers\MyEventHandler@onComplete');
}

在我的Artisan命令中,我使用Laravel IoC创建模型:

$model = \App::make('MyApp\models\MyModel');

我的模型构造函数是:

use Illuminate\Events\Dispatcher;

class DataReplication {

    protected $events;

    public function __construct(Dispatcher $events)
    {
        $this->events = $events;
    }
}

此时,将注入一个新的调度程序实例,并且我的事件处理程序中引用的任何侦听器(' MyApp \ event \ Handlers \ MyEventHandler')都不在侦听器数组中。因此,当使用$ this-> events-> fire(' event.start')时;没有可以挂钩的处理程序。

使用Facade Event :: fire(' event.start')似乎有点奇怪;来自同一型号的人将会开启“开始时间”。我的事件处理程序中的方法。

我在这里错过了什么吗?我认为工匠命令位于应用程序旁边的另一个范围内,并且只有Laravel Facades能够与全局应用程序范围绑定。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

使用\Illuminate\Contracts\Events\Dispatcher代替Illuminate\Events\Dispatcher