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():
}