Laravel 5事件处理程序未触发

时间:2015-02-01 12:15:09

标签: php events laravel 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('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');
    }

}

任何人都可以更好地解释这个过程,所以我可以继续使用迄今为止最干净的代码吗?

非常感谢

7 个答案:

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