下面由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
喜歡就支持一下吧
相關推薦