Laravel 5 事件处理程序未触发
Laravel 5 Event Handler Not Firing
所以我正在尝试新的 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;
}
}
但是,link 取决于此处理程序:
<?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('handler');在请求生命周期内不会被触发。
我已经在此处向其侦听器注册了该事件:
<?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');
}
}
任何人都可以更好地解释这个过程,以便我可以继续使用迄今为止最干净的代码吗?
非常感谢
如果您 运行 php artisan optimize
,您的事件处理程序应该开始侦听。
感谢来自 larachat slack 频道的 mattstauffer。
我遇到了类似的问题,我通过删除 vendor\compiled.php 文件修复了它。然后我再次 运行 "composer update",现在处理程序按预期触发。
我运行
composer dumpautoload
接着是
php artisan clear-compiled
然后我的事件开始触发。
在 EventServiceProvider.php
中,使用 ::class
符号引用 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',
],
];
这是一个较旧的问题,但我遇到了同样的问题,对我来说,这是因为我将我的新事件添加到服务提供商,但关键是 我没有导入 它。对于 2020 年遇到此问题的任何人,请检查您是否已导入该事件。
不要像我一样在本地缓存你的事件来测试一些东西,然后忘记清除缓存
php artisan event:clear
对我来说,我遇到过一个事件有多个侦听器的问题。在这种情况下,监听器会按顺序执行。但是,如果其中一个侦听器 return false,则不会执行所有其他侦听器。
确保您的 EventServiceProvider 正在调用父注册函数。
public function register() {
parent::register():
}
所以我正在尝试新的 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;
}
}
但是,link 取决于此处理程序:
<?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('handler');在请求生命周期内不会被触发。
我已经在此处向其侦听器注册了该事件:
<?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');
}
}
任何人都可以更好地解释这个过程,以便我可以继续使用迄今为止最干净的代码吗?
非常感谢
如果您 运行 php artisan optimize
,您的事件处理程序应该开始侦听。
感谢来自 larachat slack 频道的 mattstauffer。
我遇到了类似的问题,我通过删除 vendor\compiled.php 文件修复了它。然后我再次 运行 "composer update",现在处理程序按预期触发。
我运行
composer dumpautoload
接着是
php artisan clear-compiled
然后我的事件开始触发。
在 EventServiceProvider.php
中,使用 ::class
符号引用 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',
],
];
这是一个较旧的问题,但我遇到了同样的问题,对我来说,这是因为我将我的新事件添加到服务提供商,但关键是 我没有导入 它。对于 2020 年遇到此问题的任何人,请检查您是否已导入该事件。
不要像我一样在本地缓存你的事件来测试一些东西,然后忘记清除缓存
php artisan event:clear
对我来说,我遇到过一个事件有多个侦听器的问题。在这种情况下,监听器会按顺序执行。但是,如果其中一个侦听器 return false,则不会执行所有其他侦听器。
确保您的 EventServiceProvider 正在调用父注册函数。
public function register() {
parent::register():
}