Поэтому я тестирую новую методологию Laravel 5 Event.
В моем репозитории я увольняю мероприятие «KitchenStored» так:
// Events use App\Events\KitchenStored; class EloquentKitchen implements KitchenInterface { public function store($input) { $kitchen = new $this->kitchen; $kitchen->name = $input['name']; $kitchen->save(); \Event::fire(new KitchenStored($kitchen)); return $kitchen; }
Что успешно запускает это событие:
<?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; class KitchenStored extends Event { use SerializesModels; /** * Create a new event instance. * * @return void */ public function __construct($kitchen) { $this->kitchen = $kitchen; } }
Однако он не связан с этим обработчиком:
<?php namespace App\Handlers\Events; use App\Events\KitchenStored; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldBeQueued; class AttachCurrentUserToKitchen { /** * Create the event handler. * * @return void */ public function __construct() { dd('handler'); } /** * Handle the event. * * @param KitchenStored $event * @return void */ public function handle(KitchenStored $event) { // } }
который я знаю, потому что dd («обработчик»); не запускается во время жизненного цикла запроса.
Я зарегистрировал событие с его слушателем здесь:
<?php namespace App\Providers; use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider { /** * The event handler mappings for the application. * * @var array */ protected $listen = [ App\Events\KitchenStored::class => [ App\Handlers\Events\AttachCurrentUserToKitchen::class ] ]; /** * Register any other events for your application. * * @param \Illuminate\Contracts\Events\Dispatcher $events * @return void */ public function boot(DispatcherContract $events) { parent::boot($events); Event::listen('App\Events\KitchenStored', 'App\Handlers\Events\AttachCurrentUserToKitchen'); } }
Может ли кто-нибудь объяснить этот процесс лучше, чтобы я мог продолжать работу с самым чистым кодом, который у меня есть на сегодняшний день?
Большое спасибо
В EventServiceProvider.php
ведущую \
при ссылке на класс с использованием нотации ::class
:
protected $listener = [ \App\Events\KitchenStored::class => [ \App\Handlers\Events\AttachCurrentUserToKitchen::class, ], ];
Вы также можете добавить операторы use
и коротко ограничить отображение ваших слушателей:
use App\Events\KitchenStored; use App\Handlers\Events\AttachCurrentUserToKitchen; ... protected $listener = [ KitchenStored::class => [ AttachCurrentUserToKitchen:class, ], ];
Или просто используйте строковое обозначение:
protected $listener = [ 'App\Events\KitchenStored' => [ 'App\Handlers\Events\AttachCurrentUserToKitchen', ], ];
Если вы запустите php artisan optimize
, ваши обработчики событий должны начать прослушивание.
Поблагодарите малтустаффа из ларачатного канала для этого.
Я побежал
composer dumpautoload
с последующим
php artisan clear-compiled
Затем мои события начали стрелять.
У меня была аналогичная проблема, и я исправил ее, удалив файл vendor \ compiled.php. Затем я снова запускаю «композиторное обновление», и теперь обработчик запускается, как ожидалось.