Laravel 5 - 事件处理程序与监听器之间的混淆

10

我有点困惑于事件监听器之间的区别。

我了解如何在事件下创建你自己的事件,然后注册它们并在Handlers\Events中实现处理程序。所以这里我有事件和处理事件。

只要在Providers\EventServiceProvider.php中定义它们,它们就可以工作。

protected $listen = [
    UserHasSignedUp::class => [
        SendWelcomeEmail::class,
        SendAdminEmail::class
    ]
];

那么什么是Listeners(监听器)呢?

在我看来,它们似乎与Event Handlers(事件处理程序)完全相同?

4个回答

17
在你的例子中,UserHasSignedUp 是一个 EventSendWelcomeEmailSendAdminEmail 是两个等待事件 UserHasSignedUp 被触发并应该在每个 handle 方法中实现所需业务逻辑的监听器。
超级简单的例子:
在 UserController 的某个地方。
Event::fire(new UserHasSignedUp($user)); //UserHasSignedUp is the event being fired

发送欢迎电子邮件类

class SendWelcomeEmail //this is the listener class
{
    public function handle(UserHasSignedUp $event) //this is the "handler method"
    {
        //send an email
    }   
}

正如您所看到的,每个事件都可以有多个监听器,但是一个监听器不能监听超过一个事件。 如果您想让一个类监听多个事件,您应该看一下事件订阅者

希望这能帮到您。


啊,我想我把自己搞混了,因为我创建了一个 Listeners 文件夹,但实际上它并不是 Laravel 5 的一部分,所以我没能理解 /Handlers/Events 和 /Listeners 之间的区别。 - user391986
啊,我懂了!希望我的回答有所帮助 =) - Ezequiel Moreno
嗨,Ezequiel,我有一个问题,当我看到Laracon(2014年10月)的视频时,他们使用了事件->raise和事件->release方法,这仍然是正确的方法吗?还是自那以来已经发生了改变?https://youtu.be/2_380DKU93U?t=2034 - user391986
2
这并没有回答问题。在 Laravel 中,事件处理程序和事件监听器是两个不同的东西。只需检查 php artisan list 并查看您可以使用 Artisan 生成哪个即可。问题(以及我无论如何都找不到的)是什么区别? - JonTroncoso

1
它们之间唯一的区别似乎是,handler:event来自Laravel 5.0的文件夹结构,而make:listener新的和当前的文件夹结构。 从功能上讲,它们是相同的! - Laravel 5.1升级指南

命令和处理程序

app/Commands目录已更名为app/Jobs。但是,您不需要将所有命令移动到新位置,您可以继续使用make:command和handler:command Artisan命令来生成类。

同样,app/Handlers目录已更名为app/Listeners,现在仅包含事件侦听器。但是,您无需移动或重命名现有的命令和事件处理程序,您可以继续使用handler:event命令来生成事件处理程序。

通过为Laravel 5.0文件夹结构提供向后兼容性,您可以将应用程序升级到Laravel 5.1,并在方便您或您的团队时逐步将事件和命令升级到其新位置。

这只是Laravel 5.1提供的向后兼容性。换句话说,早期的Jobs / Commands / Listeners不是自处理的,现在是自处理的

请注意handler:event在Laravel 5.1之后不可用


0

这方面的信息并不是很多,所以这可能只是猜测。我看了一下这个视频,发现你可以使用命令处理程序。如果你正在使用命令,那么将所有处理程序放在一个地方是有意义的。但是,如果你没有使用命令,那么使用App\Handlers\Events\Whatever可能不如App\Listeners\Whatever理想。


0

监听器 vs 处理器:

监听器listen特定事件的触发。xxxxCreatedListener仅监听xxxx。

处理器可以处理多个事件的触发。例如,假设您使用执行CRUD操作,则处理器可以等待xxxxCreatedEvent、xxxxDeletedEvent、xxxxUpdatedEvent。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接