我正在尝试从工匠命令中将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能够与全局应用程序范围绑定。
感谢您的帮助。
答案 0 :(得分:2)
使用\Illuminate\Contracts\Events\Dispatcher
代替Illuminate\Events\Dispatcher