So according to the laravel event doc, when defining listeners, it can receive the event instance in their handle method and perform any logic necessary:

public function handle(FoodWasPurchased $event)

因此,如果我的FoodWasPurchased事件定义如下(假定设置了EventServiceProvider):

public function __construct(Food $food)
{
    $this->food = $food;
}

I could access the $food in event from listener by doing:

$event->food->doSomething();

But now my question is what if a listener listen to multiple events?

Event FoodWasPurchased -> Listener Bill
Event DrinksWasPurchased -> Listener Bill

我现在做的是没有在侦听器句柄方法中指定事件实例:

public function handle($event)

在那里,我可以稍后使用if条件来判断在$Event中接收到的内容:

if (isset($event->food)) {

    // Do something...

} elseif (isset($event->drinks)) {

    // Do something else...

}

我相信有更好的办法.

Or the best practice is ensure that one listener only listens to one single event ?

推荐答案

您可以使用Event Subscribers侦听多个事件,这些事件放在Listeners文件夹中,但能够侦听多个事件.

<?php

namespace App\Listeners;

class UserEventListener{
    /**
     * Handle user login events.
     */
    public function onUserLogin($event) {}

    /**
     * Handle user logout events.
     */
    public function onUserLogout($event) {}

    /**
     * Register the listeners for the subscriber.
     *
     * @param  Illuminate\Events\Dispatcher  $events
     * @return array
     */
    public function subscribe($events){
        $events->listen(
            'App\Events\UserLoggedIn',
            'App\Listeners\UserEventListener@onUserLogin'
        );

        $events->listen(
            'App\Events\UserLoggedOut',
            'App\Listeners\UserEventListener@onUserLogout'
        );
    }

}

Laravel相关问答推荐

laravel错误更新使用外键的数据库

按回车键时如何防止此功能运行?

LARAVEL 从多个表中获取重复的行

无法使用 Dompdf Laravel 9 加载图像

LARVAL SAVE 中的关系有

在 laravel 中查询此类数据的最佳做法是什么?

Laravel 5.3:语法错误或访问冲突:1463 HAVING 子句中使用了非分组字段距离

基于数据表 Laravel 4 导出 CSV 或 PDF

如何通过一个 laravel 安装处理子域

Laravel 5.1 如何在Blade 文件上使用 {{ old('') }} 助手进行无线电输入

PHP Laravel:如何设置或获取会话数据?

路由中间的可选参数

Laravel 从现有模型生成迁移

从 Laravel Cashier 获取下一个账单日期

如何在包中安排 Artisan 命令?

为什么在 Laravel 的 DB::select 中使用 DB::raw?

找不到框laravel/homestead

控制器中的artisan调用输出?

带有 Xdebug 的 Laravel 5 总是抛出The payload is invalid..

Laravel 4 控制器模板/Blade - 正确的方法?