亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

Laravel事件系統的解讀

2020-03-22 19:12:40
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了關于Laravel事件系統的解讀,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

事件系統

Laravel 的事件提供了一個簡單的觀察者實現,能夠訂閱和監聽應用中發生的各種事件。事件機制是一種很好的應用解耦方式,因為一個事件可以擁有多個互不依賴的監聽器。laravel 中事件系統由兩部分構成,一個是事件的名稱,事件的名稱可以是個字符串,例如 event.email,也可以是一個事件類,例如 App/Events/OrderShipped;另一個是事件的 監聽器listener,可以是一個閉包,還可以是監聽類,例如 App/Listeners/SendShipmentNotification。

我們還是通過官方文檔里給出的這個例子來向下分析事件系統的源碼實現,不過在應用注冊事件和監聽器之前,Laravel在應用啟動時會先注冊處理事件用的events服務。

Laravel注冊事件服務

Laravel應用在創建時注冊的基礎服務里就有Event服務

namespace Illuminate/Foundation;html' target='_blank'>class Application extends Container implements ... public function __construct($basePath = null) $this- registerBaseServiceProviders(); protected function registerBaseServiceProviders() $this- register(new EventServiceProvider($this)); $this- register(new LogServiceProvider($this)); $this- register(new RoutingServiceProvider($this));}

其中的 EventServiceProvider 是 /Illuminate/Events/EventServiceProvider

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

Illuminate/Events/Dispatcher 就是 events服務真正的實現類,而Event門面時events服務的靜態代理,事件系統相關的方法都是由Illuminate/Events/Dispatcher來提供的。

應用中注冊事件和監聽

我們還是通過官方文檔里給出的這個例子來向下分析事件系統的源碼實現,注冊事件和監聽器有兩種方法,App/Providers/EventServiceProvider 有個 listen 數組包含所有的事件(鍵)以及事件對應的監聽器(值)來注冊所有的事件監聽器,可以靈活地根據需求來添加事件。

/** * 應用程序的事件監聽器映射。 * @var arrayprotected $listen = [ App/Events/OrderShipped = [ App/Listeners/SendShipmentNotification ,];

也可以在 App/Providers/EventServiceProvider 類的 boot 方法中注冊基于事件的閉包。

/** * 注冊應用程序中的任何其他事件。 * @return voidpublic function boot() parent::boot(); Event::listen( event.name , function ($foo, $bar) {}

可以看到/App/Providers/EventProvider類的主要工作就是注冊應用中的事件,這個注冊類的主要作用是事件系統的啟動,這個類繼承自 /Illuminate/Foundation/Support/Providers/EventServiceProvide。

我們在將服務提供器的時候說過,Laravel應用在注冊完所有的服務后會通過/Illuminate/Foundation/Bootstrap/BootProviders調用所有Provider的boot方法來啟動這些服務,所以Laravel應用中事件和監聽器的注冊就發生在 /Illuminate/Foundation/Support/Providers/EventServiceProvide類的boot方法中,我們來看一下:

public function boot() foreach ($this- listens() as $event = $listeners) { foreach ($listeners as $listener) { Event::listen($event, $listener); foreach ($this- subscribe as $subscriber) { Event::subscribe($subscriber);}

可以看到事件系統的啟動是通過events服務的監聽和訂閱方法來創建事件與對應的監聽器還有系統里的事件訂閱者。

namespace Illuminate/Events;class Dispatcher implements DispatcherContract 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); protected function setupWildcardListen($event, $listener) $this- wildcards[$event][] = $this- makeListener($listener, true);}

對于包含通配符的事件名,會被統一放入 wildcards 數組中,makeListener是用來創建事件對應的listener的:

class Dispatcher implements DispatcherContract public function makeListener($listener, $wildcard = false) if (is_string($listener)) {//如果是監聽器是類,去創建監聽類 return $this- createClassListener($listener, $wildcard); return function ($event, $payload) use ($listener, $wildcard) { if ($wildcard) { return $listener($event, $payload); } else { return $listener(...array_values($payload));}

創建listener的時候,會判斷監聽對象是監聽類還是閉包函數。

對于閉包監聽來說,makeListener 會再包裝一層返回一個閉包函數作為事件的監聽者。

對于監聽類來說,會繼續通過 createClassListener 來創建監聽者

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美老女人xx| 九色成人免费视频| 北条麻妃在线一区二区| 色香阁99久久精品久久久| 欧美多人乱p欧美4p久久| 色妞欧美日韩在线| 欧美日韩成人黄色| 欧美乱妇40p| 97av在线视频免费播放| 日韩av电影手机在线| 亚洲天堂成人在线视频| 国产精品自拍偷拍| 精品国内亚洲在观看18黄| 日韩av电影手机在线| 日本精品免费观看| 欧美裸体xxxx| 亚洲欧美日韩直播| 国产精品亚洲一区二区三区| 成人黄色av播放免费| 成人欧美一区二区三区在线湿哒哒| 欧美成人午夜激情| 欧美日韩精品在线播放| 欧美视频中文字幕在线| 国产成人avxxxxx在线看| 国产精品第二页| 456国产精品| 91在线看www| 91产国在线观看动作片喷水| 亚洲人成网在线播放| 欧美与黑人午夜性猛交久久久| 国产这里只有精品| 欧美精品久久一区二区| 日韩av有码在线| 欧美美女操人视频| 日本久久亚洲电影| 欧美日韩国产丝袜美女| 国产精品第一视频| 国产精品视频公开费视频| 久久久www成人免费精品张筱雨| 992tv成人免费影院| 青青草原一区二区| 亚洲欧美日韩直播| 亚洲精品美女久久久久| 欧美中文字幕第一页| 国产精品美女在线| 国产精品久久久久久搜索| 97成人精品区在线播放| 色老头一区二区三区| 欧美黄色性视频| 国产精品狼人色视频一区| 欧美精品成人91久久久久久久| 日韩天堂在线视频| 日韩在线免费视频观看| 97在线视频精品| 国产精品一区二区三区免费视频| 国产精品老牛影院在线观看| 国产精品久久久久久av下载红粉| 亚洲奶大毛多的老太婆| 中文字幕久久亚洲| 狠狠躁18三区二区一区| 欧美成人合集magnet| 欧美精品福利在线| 国产精品久久视频| 欧美精品久久久久久久久| 亚洲韩国欧洲国产日产av| 中文字幕日韩欧美在线| 久久久视频精品| 日韩av高清不卡| 国产精品第1页| 91亚洲va在线va天堂va国| 久久深夜福利免费观看| 91系列在线播放| 成人黄色免费在线观看| 91老司机精品视频| 中文字幕日韩av电影| 国色天香2019中文字幕在线观看| 亚洲精品日韩激情在线电影| 岛国av一区二区| 成人国内精品久久久久一区| 色琪琪综合男人的天堂aⅴ视频| 欧美日韩在线视频一区| 欧美色道久久88综合亚洲精品| 亚洲影院色在线观看免费| 国产精自产拍久久久久久| 亚洲男人天堂九九视频| 亚洲自拍偷拍色片视频| 国产精品白丝jk喷水视频一区| 国产一区二区三区在线观看视频| 国产精品一区二区av影院萌芽| 国产噜噜噜噜噜久久久久久久久| 亚洲一级免费视频| 成人黄色午夜影院| 精品国产一区av| 97涩涩爰在线观看亚洲| 国产精品激情av在线播放| 欧美日韩激情美女| 中文字幕亚洲精品| 在线观看国产精品淫| 97视频网站入口| 欧美最猛性xxxxx免费| 国产一区香蕉久久| 国产性色av一区二区| 国产综合在线看| 欧美日韩亚洲一区二区| 精品久久久久久| 热久久这里只有| 亚洲欧美精品suv| 日本伊人精品一区二区三区介绍| 精品成人国产在线观看男人呻吟| 国产精品99久久久久久人| 日本亚洲欧美成人| 欧美高清视频在线播放| 国产欧美va欧美va香蕉在| 九九精品视频在线观看| 久久精品国亚洲| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品美女999| 欧美成人免费在线观看| 欧美伦理91i| 久久久久久久色| 亚洲精品98久久久久久中文字幕| 91精品久久久久久久久中文字幕| 亚洲欧美日韩天堂| 久久影视三级福利片| 欧美精品videos另类日本| 国产精品亚洲综合天堂夜夜| 色综合久综合久久综合久鬼88| 91久热免费在线视频| 91高潮精品免费porn| 成人亚洲欧美一区二区三区| 国产精品成人免费电影| 91爱爱小视频k| 尤物99国产成人精品视频| 久久九九全国免费精品观看| 伊人久久精品视频| 久久精品国产欧美激情| 日韩国产欧美区| 欧美中文字幕精品| 国产成人福利视频| 精品国产一区二区三区久久久| 中文在线资源观看视频网站免费不卡| 亚洲mm色国产网站| 国产有码一区二区| 国产自产女人91一区在线观看| 精品一区精品二区| 曰本色欧美视频在线| 精品久久在线播放| 欧美一级电影免费在线观看| 国产欧亚日韩视频| 成人午夜一级二级三级| 亚洲欧美国内爽妇网| 亚洲国产精品国自产拍av秋霞| 日本中文字幕久久看| 91免费看片在线| 亚洲人在线视频| 日韩美女福利视频| 68精品国产免费久久久久久婷婷| 亚洲男人天堂网站| 欧美精品午夜视频| 成人欧美在线观看| 91久久在线视频| 一本色道久久综合狠狠躁篇怎么玩| 日韩人在线观看| 国产精品久久久久久久久影视|