Laravel 8 事件发现
你可以启用自动事件发现,而不是在 EventServiceProvider
的 $listen
数组中手动的注册事件和监听器。事件发现启用后,Laravel 会通过扫描你应用的 Listeners
目录来自动的查找和注册事件和监听器。此外,EventServiceProvider
中列出的任何明确定义的事件仍将被注册。
Laravel 通过使用反射扫描监听器类来查找事件监听器。 当 Laravel 找到以 handle
开头的监听器类方法时,Laravel 会将这些方法注册为方法签名中类型提示的事件的事件监听器:
use App\Events\PodcastProcessed;
class SendPodcastProcessedNotification
{
/**
* 处理给定的事件。
*
* @param \App\Events\PodcastProcessed
* @return void
*/
public function handle(PodcastProcessed $event)
{
//
}
}
事件发现默认情况下是禁用的,但你可以通过覆盖应用程序的 EventServiceProvider
的 shouldDiscoverEvents
方法来启用它:
/**
* 确定是否应自动发现事件和侦听器
*
* @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
命令可用于显示应用程序注册的所有事件和监听器的列表。