摘要:所以管道模式大致需要三個角色管道,閥門和載荷流水。模仿返回處理后的結果輸出結語上面的代碼并沒有達到中間件的真正執(zhí)行部分,例子中只是用到了管道模式的一部分。
一直在用Laravel框架,很喜歡laravel框架的中間件。在請求到結果之前,如果我們想要對路由或請求進行額外的處理,簡單的加個Midleware中間件就行了,很簡單,很方便是不是。
最近幾天看了下它的中間件的實現(xiàn)方式,把自己的心得感悟寫下來分享給大家。
laravel的中間件用的是管道模式,我們先知道管道模式是什么:
所謂管道(Pipeline)設計模式就是將會數(shù)據(jù)傳遞到一個任務序列中,管道扮演者流水線的角色,數(shù)據(jù)在這里被處理然后傳遞到下一個步驟
管道,顧名思義,就是一個長長的流水管道,只不過加了許多閥門。所以管道模式大致需要三個角色:管道,閥門和載荷(流水)。如下圖:
開始代碼之前,我們必須先了解管道模式的模型圖
根據(jù)上面的模型圖,我們來實現(xiàn)自己所理解的管道模式的代碼:
/** * PipelineBuilder 接口 即管道 * @method pipe 存入多個閥門 * @method process 輸出 */ interface PipelineBuilderInterface { public function __construct($payload); public function pipe(StageBuilderInterface $stage); public function process(); } // 具體的管道類 class Pipeline implements PipelineBuilderInterface { protected $payload; protected $pipes = []; public function __construct($payload) { $this->payload = $payload; } public function pipe(StageBuilderInterface $stage) { $this->pipes[] = $stage; return $this; } public function process() { foreach ($this->pipes as $pipe) { call_user_func([$pipe, "handle"], $this->payload); } } } // 閥門接口 interface StageBuilderInterface { public function handle($payload); } // 具體的閥門類 class StageOneBuilder implements StageBuilderInterface { public function handle($payload) { echo $payload ." 真是個"; } } // 具體的閥門類 class StageTwoBuilder implements StageBuilderInterface { public function handle($payload) { echo "帥氣的男人"; } } // 輸出:我真是個帥氣的男人 $pipeline = new Pipeline("我"); $pipeline->pipe(new StageOneBuilder) ->pipe(new StageTwoBuilder) ->process();底層源碼
先來看看它的底層源碼:
return (new Pipeline($this->container)) ->send($request) ->through($middleware) ->then(function ($request) use ($route) { return $this->prepareResponse( $request, $route->run() ); });
上面的代碼是處理request請求的一部分代碼,send()獲取待處理的數(shù)據(jù),through()獲取中間件,then()傳遞閉包函數(shù)。
基本上,使用laravel pipelines你可以將一個實例對象(object)在多個類之間傳遞,就像流水順著管道依次流淌一般,最終呢,層層傳遞,你就得到了從頭至尾一系列執(zhí)行操作的“最終”結果。
interface PipelineInterface { public function send($traveler); public function through($stops); public function via($method); public function process(); } interface StageInterface { public function handle($payload); } class StageOne implements StageInterface { public function handle($payload) { echo $payload . " am really an "; } } class StageTwo implements StageInterface { public function handle($payload) { echo "awesome man"; } } class Pipe implements PipelineInterface { protected $container; protected $passable; protected $pipes = []; protected $via = "handle"; public function __construct($container) { $this->container = $container; } public function send($passable) { $this->passable = $passable; return $this; } public function through($pipes) { $this->pipes = is_array($pipes) ? $pipes : func_get_args(); return $this; } public function via($method) { $this->via = $method; return $this; } public function process() { foreach ($this->pipes as $pipe) { // 返回處理后的結果 $this->passable = call_user_func([$pipe, $this->via], $this->passable); } } } $container = "a"; $payload = "wa"; $pipe = new Pipe($container); // 輸出:I am really an awesome man $pipe->send($payload)->through([(new StageOne), (new StageTwo)])->process();結語
上面的代碼并沒有達到laravel中間件的真正執(zhí)行部分,例子中只是用到了管道模式的一部分。像then()方法中還用了array_reduce和array_reverse函數(shù)來處理請求,這一部分有時間會進一步研究。
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31352.html
摘要:目的綜上所述,我的目標就是實現(xiàn)基于模式實現(xiàn)的多進程管理工具。備注下文中,父進程統(tǒng)稱為子進程統(tǒng)稱為。最后我們通過下圖來簡單的總結和描述這個多進程實現(xiàn)的過程控制上面實現(xiàn)了多進程和多進程的常駐內(nèi)存,那如何去管理呢答案多進程通信。 _ | | _ __ __ _ _ __...
摘要:定義任務處理方法。讀取來自命令行的參數(shù),開始執(zhí)行任務。該函數(shù)有兩個參數(shù)和,是引用類型,用來存儲子進程的狀態(tài),有兩個可選常量,分別表示不等待子進程結束立即返回和等待子進程結束。 用PHP來實現(xiàn)異步任務一直是個難題,現(xiàn)有的解決方案中:PHP知名的異步框架有 swoole 和 Workerman,但都是無法在 web 環(huán)境中直接使用的,即便強行搭建 web 環(huán)境,異步調用也是使用多進程模式實...
摘要:運行模式實現(xiàn)進程前,需了解常見的的運行模式通用網(wǎng)關接口模式模式命令行模式模塊模式作為服務器模塊而進程則是使用命令行模式運行的基本實現(xiàn)中提供了一個擴展,可以利用操作系統(tǒng)的調用來實現(xiàn)多進程。 應用場景 一些耗時任務: 大數(shù)據(jù)表分表后的統(tǒng)計信息功能 分批發(fā)送短信或郵件功能 其他可分目標的任務功能(很多種) 所以我們就需要一個常駐內(nèi)存的任務管理工具,為了保證實時性,一方面我們讓它一直執(zhí)行任...
摘要:運行模式實現(xiàn)進程前,需了解常見的的運行模式通用網(wǎng)關接口模式模式命令行模式模塊模式作為服務器模塊而進程則是使用命令行模式運行的基本實現(xiàn)中提供了一個擴展,可以利用操作系統(tǒng)的調用來實現(xiàn)多進程。 應用場景 一些耗時任務: 大數(shù)據(jù)表分表后的統(tǒng)計信息功能 分批發(fā)送短信或郵件功能 其他可分目標的任務功能(很多種) 所以我們就需要一個常駐內(nèi)存的任務管理工具,為了保證實時性,一方面我們讓它一直執(zhí)行任...
閱讀 2432·2021-11-18 10:02
閱讀 690·2021-10-08 10:04
閱讀 2258·2021-09-03 10:51
閱讀 3547·2019-08-30 15:44
閱讀 2804·2019-08-29 14:09
閱讀 2469·2019-08-29 12:21
閱讀 2067·2019-08-26 13:45
閱讀 1807·2019-08-26 13:25