摘要:大家好,今天給大家介紹下框架的。它是一個(gè)非常好用的組件,能夠使代碼的結(jié)構(gòu)非常清晰。的中間件機(jī)制便是基于它來實(shí)現(xiàn)的。通過,生成一個(gè)接受一個(gè)參數(shù)的匿名函數(shù),然后執(zhí)行調(diào)用。不合法可以執(zhí)行初始化狀態(tài)的操作可以執(zhí)行保存狀態(tài)信息的操作執(zhí)行其它邏輯
大家好,今天給大家介紹下Laravel框架的Pipeline。
它是一個(gè)非常好用的組件,能夠使代碼的結(jié)構(gòu)非常清晰。 Laravel的中間件機(jī)制便是基于它來實(shí)現(xiàn)的。
通過Pipeline,可以輕松實(shí)現(xiàn)APO編程。
官方GIT地址https://github.com/illuminate...
下面的代碼是我實(shí)現(xiàn)的一個(gè)簡(jiǎn)化版本:class Pipeline { /** * The method to call on each pipe * @var string */ protected $method = "handle"; /** * The object being passed throw the pipeline * @var mixed */ protected $passable; /** * The array of class pipes * @var array */ protected $pipes = []; /** * Set the object being sent through the pipeline * * @param $passable * @return $this */ public function send($passable) { $this->passable = $passable; return $this; } /** * Set the method to call on the pipes * @param array $pipes * @return $this */ public function through($pipes) { $this->pipes = $pipes; return $this; } /** * @param Closure $destination * @return mixed */ public function then(Closure $destination) { $pipeline = array_reduce(array_reverse($this->pipes), $this->getSlice(), $destination); return $pipeline($this->passable); } /** * Get a Closure that represents a slice of the application onion * @return Closure */ protected function getSlice() { return function($stack, $pipe){ return function ($request) use ($stack, $pipe) { return $pipe::{$this->method}($request, $stack); }; }; } }
此類主要邏輯就在于then和getSlice方法。通過array_reduce,生成一個(gè)接受一個(gè)參數(shù)的匿名函數(shù),然后執(zhí)行調(diào)用。
簡(jiǎn)單使用示例class ALogic { public static function handle($data, Clourse $next) { print "開始 A 邏輯"; $ret = $next($data); print "結(jié)束 A 邏輯"; return $ret; } } class BLogic { public static function handle($data, Clourse $next) { print "開始 B 邏輯"; $ret = $next($data); print "結(jié)束 B 邏輯"; return $ret; } } class CLogic { public static function handle($data, Clourse $next) { print "開始 C 邏輯"; $ret = $next($data); print "結(jié)束 C 邏輯"; return $ret; } }
$pipes = [ ALogic::class, BLogic::class, CLogic::class ]; $data = "any things"; (new Pipeline())->send($data)->through($pipes)->then(function($data){ print $data;});
"開始 A 邏輯" "開始 B 邏輯" "開始 C 邏輯" "any things" "結(jié)束 C 邏輯" "結(jié)束 B 邏輯" "結(jié)束 A 邏輯"AOP示例
AOP 的優(yōu)點(diǎn)就在于動(dòng)態(tài)的添加功能,而不對(duì)其它層次產(chǎn)生影響,可以非常方便的添加或者刪除功能。
class IpCheck { public static function handle($data, Clourse $next) { if ("IP invalid") { // IP 不合法 throw Exception("ip invalid"); } return $next($data); } } class StatusManage { public static function handle($data, Clourse $next) { // exec 可以執(zhí)行初始化狀態(tài)的操作 $ret = $next($data) // exec 可以執(zhí)行保存狀態(tài)信息的操作 return $ret; } } $pipes = [ IpCheck::class, StatusManage::class, ]; (new Pipeline())->send($data)->through($pipes)->then(function($data){ "執(zhí)行其它邏輯";});
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29913.html
摘要:解析出后將進(jìn)入應(yīng)用的請(qǐng)求對(duì)象傳遞給的方法,在方法負(fù)責(zé)處理流入應(yīng)用的請(qǐng)求對(duì)象并返回響應(yīng)對(duì)象。攜帶了本次迭代的值。通過這種方式讓請(qǐng)求對(duì)象依次流過了要通過的中間件,達(dá)到目的地的方法。 中間件(Middleware)在Laravel中起著過濾進(jìn)入應(yīng)用的HTTP請(qǐng)求對(duì)象(Request)和完善離開應(yīng)用的HTTP響應(yīng)對(duì)象(Reponse)的作用, 而且可以通過應(yīng)用多個(gè)中間件來層層過濾請(qǐng)求、逐步完善...
摘要:下面是剛才說的這些步驟對(duì)應(yīng)的核心代碼收集路由和控制器里應(yīng)用的中間件我們?cè)谇懊娴奈恼吕镆呀?jīng)詳細(xì)的解釋過中間件和路由的原理了,接下來就看看當(dāng)請(qǐng)求最終找到了路由對(duì)應(yīng)的控制器方法后是如何為控制器方法注入正確的參數(shù)并調(diào)用控制器方法的。 控制器 控制器能夠?qū)⑾嚓P(guān)的請(qǐng)求處理邏輯組成一個(gè)單獨(dú)的類, 通過前面的路由和中間件兩個(gè)章節(jié)我們多次強(qiáng)調(diào)Laravel應(yīng)用的請(qǐng)求在進(jìn)入應(yīng)用后首現(xiàn)會(huì)通過Http Ker...
摘要:設(shè)置生成對(duì)象后就要執(zhí)行對(duì)象的方法了,該方法定義在類中,其主要目的是對(duì)進(jìn)行微調(diào)使其能夠遵從協(xié)議。最后會(huì)把完整的響應(yīng)發(fā)送給客戶端。本文已經(jīng)收錄在系列文章源碼學(xué)習(xí)里,歡迎訪問閱讀。 Response 前面兩節(jié)我們分別講了Laravel的控制器和Request對(duì)象,在講Request對(duì)象的那一節(jié)我們看了Request對(duì)象是如何被創(chuàng)建出來的以及它支持的方法都定義在哪里,講控制器時(shí)我們?cè)敿?xì)地描述了...
摘要:查閱官方文檔后得知,新版為了防止對(duì)象的序列化反序列化漏洞被利用,不再對(duì)值進(jìn)行自動(dòng)的序列化和反序列化處理。舉個(gè)栗子更新到后,因?yàn)椴辉僮詣?dòng)對(duì)值進(jìn)行序列化處理,而只能加密字符串?dāng)?shù)據(jù),這個(gè)時(shí)候程序就會(huì)拋出錯(cuò)誤。 最近手殘升級(jí)了項(xiàng)目里 Laravel 的小版本號(hào)(v5.5.39 => v5.5.45),這不升級(jí)則已,一升級(jí)就出了問題! Sentry 平臺(tái)上提示錯(cuò)誤:openssl_encrypt...
又有一段時(shí)間沒有學(xué)習(xí)了!迷茫,除了迷茫還是在迷茫!最近,公司接了一個(gè)laravel的項(xiàng)目,可惜沒有phper,于是開始學(xué)習(xí)laravel,現(xiàn)在的情況就是還沒學(xué)會(huì)走路就要開始跑了,所以遇到坑會(huì)摔得很痛! 安裝出現(xiàn)的問題 安裝步驟(5.3.*) composer global require laravel/installer composer create...
閱讀 3487·2021-10-13 09:39
閱讀 1468·2021-10-08 10:05
閱讀 2273·2021-09-26 09:56
閱讀 2289·2021-09-03 10:28
閱讀 2688·2019-08-29 18:37
閱讀 2047·2019-08-29 17:07
閱讀 609·2019-08-29 16:23
閱讀 2200·2019-08-29 11:24