所以我正在尝试新的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('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');
}
}
任何人都可以更好地解释这个过程,所以我可以继续使用迄今为止最干净的代码吗?
非常感谢
答案 0 :(得分:21)
在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',
],
];
答案 1 :(得分:17)
如果您运行php artisan optimize
,您的事件处理程序应该开始监听。
对来自larachat slack频道的mattstauffer表示赞同。
答案 2 :(得分:11)
我跑了
composer dumpautoload
接着是
php artisan clear-compiled
然后我的事件就开始了。
答案 3 :(得分:0)
这是一个比较老的问题,但是我遇到了同样的问题,对我来说,这是因为我将我的新活动添加到了服务提供商中,但关键是我没有导入。对于2020年有此问题的任何人,请检查您是否已导入事件。
答案 4 :(得分:0)
不要像我一样在本地缓存事件以测试某些内容,然后忘记清除该缓存?
addItem()
答案 5 :(得分:0)
对我来说,我遇到了单个事件有多个侦听器的问题。在这种情况下,侦听器按顺序执行。但是,如果其中一个侦听器返回 false,则不会执行其他所有侦听器。
答案 6 :(得分:0)
确保您的 EventServiceProvider 正在调用父注册函数。
public function register() {
parent::register():
}