Обработчик событий Laravel 5 не стреляет
Итак, я тестирую новую методологию событий Laravel 5.
В моем репозитории я запускаю событие "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');
}
}
Может ли кто-нибудь объяснить этот процесс лучше, чтобы я мог продолжать работу с самым чистым кодом, который у меня есть на сегодняшний день?
Большое спасибо
Ответы
Ответ 1
В 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',
],
];
Ответ 2
Если вы запустите php artisan optimize
, ваши обработчики событий должны начать прослушивание.
Благодарим малтестаффа от каната слабительного ларача для этого.
Ответ 3
Я побежал
composer dumpautoload
за которым следует
php artisan clear-compiled
Затем мои события начали стрелять.
Ответ 4
У меня была аналогичная проблема, и я исправил ее, удалив файл vendor\compiled.php. Затем я снова запускаю "композиторное обновление", и теперь обработчик запускается, как ожидалось.