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命令可用于显示应用程序注册的所有事件和监听器的列表。