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

Laravel 5 - Confusion between Event Handlers and Listeners

我对 EventsListeners 之间的区别有点困惑。

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

我在 Providers\EventServiceProvider.php

中定义它们后它们就起作用了
protected $listen = [
    UserHasSignedUp::class => [
        SendWelcomeEmail::class,
        SendAdminEmail::class
    ]
];

那么 Listeners 是什么?

对我来说,它们似乎与 事件处理程序?

完全一样

在你的例子中 UserHasSignedUp 是一个 EventSendWelcomeEmailSendAdminEmail 是要触发事件 UserHasSignedUp 的两个侦听器 "waiting",它们应该在每个侦听器的 handle 方法中实现所需的业务逻辑。

超级简单的例子:

UserController 中的某处

Event::fire(new UserHasSignedUp($user)); //UserHasSignedUp is the event being fired

发送欢迎邮件class

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

如您所见,每个事件可以有多个侦听器,但一个侦听器只能侦听一个事件。 如果你想要 class 监听很多事件,你应该看看 Event Subscribers

希望对您有所帮助。

关于这方面的信息不多,所以这可能只是猜测。我看了一下 this video,发现您可以将处理程序与命令一起使用。我认为如果您使用的是命令,那么将所有处理程序放在一个位置是有意义的。但是,如果您不是,那么拥有 App\Handlers\Events\Whatever 可能不如 App\Listeners\Whatever 令人满意。

听众与处理者:

要触发的特定事件的侦听器 listen。 xxxxCreatedListener 只会监听 xxxx

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

它们之间的唯一区别似乎是,handler:event 来自 Laravel 5.0 的文件夹结构,而 make:listenernew & current 文件夹结构。 在功能上,它们是相同的! - Upgrade Guide to Laravel 5.1

Commands & Handlers

The app/Commands directory has been renamed to app/Jobs. However, you are not required to move all of your commands to the new location, and you may continue using the make:command and handler:command Artisan commands to generate your classes.

Likewise, the app/Handlers directory has been renamed to app/Listeners and now only contains event listeners. However, you are not required to move or rename your existing command and event handlers, and you may continue to use the handler:event command to generate event handlers.

By providing backwards compatibility for the Laravel 5.0 folder structure, you may upgrade your applications to Laravel 5.1 and slowly upgrade your events and commands to their new locations when it is convenient for you or your team.

这只是Laravel 5.1中提供的向后兼容性。也就是说,之前Jobs/Commands/Listeners是不自处理,现在

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