Laravel 8 事件發(fā)現(xiàn)

2021-07-19 10:04 更新

你可以啟用自動事件發(fā)現(xiàn),而不是在 EventServiceProvider$listen 數(shù)組中手動的注冊事件和監(jiān)聽器。事件發(fā)現(xiàn)啟用后,Laravel 會通過掃描你應(yīng)用的 Listeners 目錄來自動的查找和注冊事件和監(jiān)聽器。此外,EventServiceProvider 中列出的任何明確定義的事件仍將被注冊。

Laravel 通過使用反射掃描監(jiān)聽器類來查找事件監(jiān)聽器。 當 Laravel 找到以 handle 開頭的監(jiān)聽器類方法時,Laravel 會將這些方法注冊為方法簽名中類型提示的事件的事件監(jiān)聽器:

use App\Events\PodcastProcessed;

class SendPodcastProcessedNotification
{
    /**
     * 處理給定的事件。
     *
     * @param  \App\Events\PodcastProcessed
     * @return void
     */
    public function handle(PodcastProcessed $event)
    {
        //
    }
}

事件發(fā)現(xiàn)默認情況下是禁用的,但你可以通過覆蓋應(yīng)用程序的 EventServiceProvidershouldDiscoverEvents 方法來啟用它:

/**
 * 確定是否應(yīng)自動發(fā)現(xiàn)事件和偵聽器
 *
 * @return bool
 */
public function shouldDiscoverEvents()
{
    return true;
}

默認情況下,在應(yīng)用程序的 Listeners 目錄中的所有監(jiān)聽器將被掃描。如果你想要定義掃描其他目錄,可以覆蓋 EventServiceProvider 中的 discoverEventsWithin 方法:

/**
 * 獲取應(yīng)該用于發(fā)現(xiàn)事件的監(jiān)聽器的目錄
 *
 * @return array
 */
protected function discoverEventsWithin()
{
    return [
        $this->app->path('Listeners'),
    ];
}

在生產(chǎn)環(huán)境中,你可能不希望框架在每個請求上掃描所有監(jiān)聽器。 因此,在部署過程中,你應(yīng)該運行 event:cache Artisan 命令來緩存應(yīng)用程序的所有事件和監(jiān)聽器的列表。 框架將使用此列表來加速事件注冊過程。event:clear 命令則可用于銷毀緩存。

技巧:event:list 命令可用于顯示應(yīng)用程序注冊的所有事件和監(jiān)聽器的列表。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號