阅读(4443) (7)

Laravel 8 事件发现

2021-07-01 16:46:30 更新

你可以启用自动事件发现,而不是在 EventServiceProvider$listen 数组中手动的注册事件和监听器。事件发现启用后,Laravel 会通过扫描你应用的 Listeners 目录来自动的查找和注册事件和监听器。此外,EventServiceProvider 中列出的任何明确定义的事件仍将被注册。

Laravel 通过使用反射扫描监听器类来查找事件监听器。 当 Laravel 找到以 handle 开头的监听器类方法时,Laravel 会将这些方法注册为方法签名中类型提示的事件的事件监听器:

use AppEventsPodcastProcessed;

class SendPodcastProcessedNotification
{
    /**
     * 处理给定的事件。
     *
     * @param  AppEventsPodcastProcessed
     * @return void
     */
    public function handle(PodcastProcessed $event)
    {
        //
    }
}

事件发现默认情况下是禁用的,但你可以通过覆盖应用程序的 EventServiceProvidershouldDiscoverEvents 方法来启用它:

/**
 * 确定是否应自动发现事件和侦听器
 *
 * @return bool
 */
public function shouldDiscoverEvents()
{
    return true;
}

默认情况下,在应用程序的 Listeners 目录中的所有监听器将被扫描。如果你想要定义扫描其他目录,可以覆盖 EventServiceProvider 中的 discoverEventsWithin 方法:

/**
 * 获取应该用于发现事件的监听器的目录
 *
 * @return array
 */
protected function discoverEventsWithin()
{
    return [
        $this->app->path('Listeners'),
    ];
}

在生产环境中,你可能不希望框架在每个请求上扫描所有监听器。 因此,在部署过程中,你应该运行 event:cache Artisan 命令来缓存应用程序的所有事件和监听器的列表。 框架将使用此列表来加速事件注册过程。event:clear 命令则可用于销毁缓存。

技巧:event:list 命令可用于显示应用程序注册的所有事件和监听器的列表。