Я пытаюсь внедрить диспетчер событий 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 удается привязать к глобальной области приложения.
Спасибо за вашу помощь.
использование \Illuminate\Contracts\Events\Dispatcher
вместо Illuminate\Events\Dispatcher
Других решений пока нет …