摘要:大家好,今天給大家介紹下框架的。它是一個非常好用的組件,能夠使代碼的結構非常清晰。的中間件機制便是基于它來實現(xiàn)的。通過,生成一個接受一個參數(shù)的匿名函數(shù),然后執(zhí)行調用。不合法可以執(zhí)行初始化狀態(tài)的操作可以執(zhí)行保存狀態(tài)信息的操作執(zhí)行其它邏輯
大家好,今天給大家介紹下Laravel框架的Pipeline。
它是一個非常好用的組件,能夠使代碼的結構非常清晰。 Laravel的中間件機制便是基于它來實現(xiàn)的。
通過Pipeline,可以輕松實現(xiàn)APO編程。
官方GIT地址https://github.com/illuminate...
下面的代碼是我實現(xià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,生成一個接受一個參數(shù)的匿名函數(shù),然后執(zhí)行調用。
簡單使用示例class ALogic { public static function handle($data, Clourse $next) { print "開始 A 邏輯"; $ret = $next($data); print "結束 A 邏輯"; return $ret; } } class BLogic { public static function handle($data, Clourse $next) { print "開始 B 邏輯"; $ret = $next($data); print "結束 B 邏輯"; return $ret; } } class CLogic { public static function handle($data, Clourse $next) { print "開始 C 邏輯"; $ret = $next($data); print "結束 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" "結束 C 邏輯" "結束 B 邏輯" "結束 A 邏輯"AOP示例
AOP 的優(yōu)點就在于動態(tài)的添加功能,而不對其它層次產(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í)行其它邏輯";});
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29913.html
摘要:解析出后將進入應用的請求對象傳遞給的方法,在方法負責處理流入應用的請求對象并返回響應對象。攜帶了本次迭代的值。通過這種方式讓請求對象依次流過了要通過的中間件,達到目的地的方法。 中間件(Middleware)在Laravel中起著過濾進入應用的HTTP請求對象(Request)和完善離開應用的HTTP響應對象(Reponse)的作用, 而且可以通過應用多個中間件來層層過濾請求、逐步完善...
摘要:下面是剛才說的這些步驟對應的核心代碼收集路由和控制器里應用的中間件我們在前面的文章里已經(jīng)詳細的解釋過中間件和路由的原理了,接下來就看看當請求最終找到了路由對應的控制器方法后是如何為控制器方法注入正確的參數(shù)并調用控制器方法的。 控制器 控制器能夠將相關的請求處理邏輯組成一個單獨的類, 通過前面的路由和中間件兩個章節(jié)我們多次強調Laravel應用的請求在進入應用后首現(xiàn)會通過Http Ker...
摘要:設置生成對象后就要執(zhí)行對象的方法了,該方法定義在類中,其主要目的是對進行微調使其能夠遵從協(xié)議。最后會把完整的響應發(fā)送給客戶端。本文已經(jīng)收錄在系列文章源碼學習里,歡迎訪問閱讀。 Response 前面兩節(jié)我們分別講了Laravel的控制器和Request對象,在講Request對象的那一節(jié)我們看了Request對象是如何被創(chuàng)建出來的以及它支持的方法都定義在哪里,講控制器時我們詳細地描述了...
摘要:查閱官方文檔后得知,新版為了防止對象的序列化反序列化漏洞被利用,不再對值進行自動的序列化和反序列化處理。舉個栗子更新到后,因為不再自動對值進行序列化處理,而只能加密字符串數(shù)據(jù),這個時候程序就會拋出錯誤。 最近手殘升級了項目里 Laravel 的小版本號(v5.5.39 => v5.5.45),這不升級則已,一升級就出了問題! Sentry 平臺上提示錯誤:openssl_encrypt...
又有一段時間沒有學習了!迷茫,除了迷茫還是在迷茫!最近,公司接了一個laravel的項目,可惜沒有phper,于是開始學習laravel,現(xiàn)在的情況就是還沒學會走路就要開始跑了,所以遇到坑會摔得很痛! 安裝出現(xiàn)的問題 安裝步驟(5.3.*) composer global require laravel/installer composer create...
閱讀 3475·2021-10-13 09:39
閱讀 1458·2021-10-08 10:05
閱讀 2260·2021-09-26 09:56
閱讀 2275·2021-09-03 10:28
閱讀 2673·2019-08-29 18:37
閱讀 2032·2019-08-29 17:07
閱讀 600·2019-08-29 16:23
閱讀 2191·2019-08-29 11:24