你知道laravel事件的實現原理嗎

下面由laravel教程欄目給大家介紹laravel事件的實現原理,希望對需要的朋友有所幫助!

你知道laravel事件的實現原理嗎

簡單使用

1.配置事件和監聽器AppProviders EventServiceProvider的listen屬性

protected?$listen?=?[ ????????'AppEventsUserAdd'?=>?[ ????????????'AppListenersUserAddListener', ????????], ????];

2.生成對應的事件類和監聽類文件,

php?artisan?event:generate

會生成AppEventsUserAdd,AppListenersUserAddListener兩個類文件。

事件類主要是保存對應的信息的作用,比如一個屬性保存user模型實例,事件類實例會傳給對應的事件監聽器的handle方法處理事件邏輯。

public?function?__construct(User?$user) { ???$this->user?=?$user;//創建事件實例時保存的信息 }

AppListenersUserAddListener 監聽器的handle方法就是處理邏輯的地方

public?function?handle(UserAdd?$event) { ????????dd($event->user);//獲取到對應事件實例的信息 }

3.事件的觸發,使用公共函數events()。傳入對應事件類的實例

event(new?AppEventsUserAdd($user));//執行這一步時,就會執行到handle方法

實現原理(IlluminateEventsDispatcher類)

public?function?register() { ????$this->app->singleton('events',?function?($app)?{ ????????return?(new?Dispatcher($app))->setQueueResolver(function?()?use?($app)?{ ????????????return?$app->make(QueueFactoryContract::class); ????????}); ????}); }

注冊到IOC容器的events其實是IlluminateEventsDispatcher類,也就是門面Event其實調用的是這個類的方法

重要屬性和方法:

protected?$listeners?=?[]; protected?$wildcards?=?[]; protected?$wildcardsCache?=?[];//這三個屬性都是配置事件與監聽器關系的數組,時間注冊進來后就是放到對應的數組里面的。 //這個方法就是注冊事件用的,把配置好的事件注入到上面的屬性中 public?function?listen($events,?$listener) ????{ ????????foreach?((array)?$events?as?$event)?{ ????????????if?(Str::contains($event,?'*'))?{ ????????????????$this->setupWildcardListen($event,?$listener); ????????????}?else?{ ????????????????$this->listeners[$event][]?=?$this->makeListener($listener); ????????????} ????????} ????} //這個方法就是執行對應事件監聽器的方法,找到事件下面的是所有監聽器,然后執行。 public?function?dispatch($event,?$payload?=?[],?$halt?=?false),

以上就是你知道

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享