События Laravel не запускаются при внедрении Dispatcher в конструктор модели

Я пытаюсь внедрить диспетчер событий Laravel в конструктор моей модели из команды ремесленника, но не могу запустить подписанные события из этой зависимости.

Похоже, что Laravel внедряет новый экземпляр Illuminate \ Events \ Dispatcher вместо повторного использования диспетчера приложений. Я следил за видео Laracast от Джеффа Уэя для реализации.

Я добавил в app / start / global.php:

требуют app_path (). ‘/Events.php’;

Это ссылается на файл с именем events.php, содержащий:

Событие :: подписаться ( ‘MyApp \ события \ Хендлеры \ MyEventHandler’);

В файле 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’); из той же модели будет запускать метод onStart в моем обработчике событий.

Есть ли что-то, что я пропускаю здесь? У меня сложилось впечатление, что ремесленные команды находятся в другой области, кроме Приложения, и что только Laravel Facades удается привязать к глобальной области приложения.

Спасибо за вашу помощь.

0

Решение

использование \Illuminate\Contracts\Events\Dispatcher вместо Illuminate\Events\Dispatcher

2

Другие решения

Других решений пока нет …