电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP Pipeline 實現中間件的示例代碼

瀏覽:129日期:2022-09-10 16:11:52

Pipeline 設計模式

水管太長,只要有一處破了,就會漏水了,而且不利于復雜環境彎曲轉折使用。所以我們都會把水管分成很短的一節一節管道,然后最大化的讓管道大小作用不同,因地制宜,組裝在一起,滿足各種各樣的不同需求。

由此得出 Pipeline 的設計模式,就是將復雜冗長的流程 (processes) 截成各個小流程,小任務。每個最小量化的任務就可以復用,通過組裝不同的小任務,構成復雜多樣的流程 (processes)。

最后將「輸入」引入管道,根據每個小任務對輸入進行操作 (加工、過濾),最后輸出滿足需要的結果。

你可以拿koa的中間件機制來做參考 ,也就是我們常說的削洋蔥思路

PHP Pipeline 實現中間件的示例代碼

在前端里早期有一個工程打包工具gulp寫法就更能體現pipeline

gulp.task(’css’, function(){ return gulp.src(’client/templates/*.less’) .pipe(less()) .pipe(minifyCSS()) .pipe(gulp.dest(’build/css’))});gulp.task(’js’, function(){ return gulp.src(’client/javascript/*.js’) .pipe(sourcemaps.init()) .pipe(concat(’app.min.js’)) .pipe(sourcemaps.write()) .pipe(gulp.dest(’build/js’))});gulp.task(’default’, [ ’html’, ’css’, ’js’ ]);

IlluminatePipeline

Laravel 框架中的中間件,就是利用 IlluminatePipeline 來實現的,本來想寫寫我對 「Laravel 中間件」源碼的解讀,但發現網上已經有很多帖子都有表述了,所以本文就簡單說說如何使用 IlluminatePipeline。

public function demo(Request $request){ $pipe1 = function ($payload, Closure $next) { $payload = $payload + 1; return $next($payload); }; $pipe2 = function ($payload, Closure $next) { $payload = $payload * 3; return $next($payload); }; $data = $request->input(’data’, 0); $pipeline = new Pipeline(); return $pipeline ->send($data) ->through([$pipe1, $pipe2]) ->then(function ($data) { return $data; });}

今天主要學習學習「Pipeline」,順便推薦一個 PHP 插件:league/pipeline。

composer require league/pipeline

使用起來也很方便

use LeaguePipelinePipeline;class TimesTwoStage{ public function __invoke($payload) { return $payload * 2; }}class AddOneStage{ public function __invoke($payload) { return $payload + 1; }}$pipeline = (new Pipeline) ->pipe(new TimesTwoStage) ->pipe(new AddOneStage);// Returns 21$pipeline->process(10);

接下來我們添加FastRouter在我的項目中使用。

PHP Pipeline 實現中間件的示例代碼

上面的代碼修改成這樣

PHP Pipeline 實現中間件的示例代碼

我們接下來看看 RespondJson 里做了什么.

<?phpnamespace PlatappsMiddlewares;class RespondJson{ public function __invoke($payload) { header(’Content-type:text/json’); return $payload; }}

就簡單的加了個 header

我們試試把注釋到一個渠道

PHP Pipeline 實現中間件的示例代碼

我們再次訪問的時候就變成

PHP Pipeline 實現中間件的示例代碼

當然這是很簡單的中間件,這種中間件遠遠不夠,這里是核心代碼,可以去這里看看,也比較簡單。

我們最終需要修改pipe這個方法

namespace LeaguePipeline;class Pipeline implements PipelineInterface{ /** * @var callable[] */ private $stages = []; /** * @var ProcessorInterface */ private $processor; public function __construct(ProcessorInterface $processor = null, callable ...$stages) { $this->processor = $processor ?? new FingersCrossedProcessor; $this->stages = $stages; } public function pipe(callable $stage): PipelineInterface { $pipeline = clone $this; $pipeline->stages[] = $stage; return $pipeline; } public function process($payload) { return $this->processor->process($payload, ...$this->stages); } public function __invoke($payload) { return $this->process($payload); }}

這么多框架里面我這里建議拿Tp6的來做參考,功能還算夠用。

<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: yunwuxin <448901948@qq.com>// +----------------------------------------------------------------------namespace think;use Closure;use Exception;use Throwable;class Pipeline{ protected $passable; protected $pipes = []; protected $exceptionHandler; /** * 初始數據 * @param $passable * @return $this */ public function send($passable) { $this->passable = $passable; return $this; } /** * 調用棧 * @param $pipes * @return $this */ public function through($pipes) { $this->pipes = is_array($pipes) ? $pipes : func_get_args(); return $this; } /** * 執行 * @param Closure $destination * @return mixed */ public function then(Closure $destination) { $pipeline = array_reduce( array_reverse($this->pipes), $this->carry(), function ($passable) use ($destination) {try { return $destination($passable);} catch (Throwable | Exception $e) { return $this->handleException($passable, $e);} }); return $pipeline($this->passable); } /** * 設置異常處理器 * @param callable $handler * @return $this */ public function whenException($handler) { $this->exceptionHandler = $handler; return $this; } protected function carry() { return function ($stack, $pipe) { return function ($passable) use ($stack, $pipe) {try { return $pipe($passable, $stack);} catch (Throwable | Exception $e) { return $this->handleException($passable, $e);} }; }; } /** * 異常處理 * @param $passable * @param $e * @return mixed */ protected function handleException($passable, Throwable $e) { if ($this->exceptionHandler) { return call_user_func($this->exceptionHandler, $passable, $e); } throw $e; }}

這種寫法有什么好?

其實就好就好在,你在處理一個請求的過程中,分配任務的時候,在處理的過程,每個中間的人,只要做自己處理的請求和結果還有請求即可。讓當數據到達Controller里的時候,顯示業務邏輯的時候更加強大

到此這篇關于PHP Pipeline 實現中間件的示例代碼的文章就介紹到這了,更多相關PHP Pipeline 中間件內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: PHP
相關文章:
主站蜘蛛池模板: 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 断桥铝破碎机_铝合金破碎机_废铁金属破碎机-河南鑫世昌机械制造有限公司 | OpenI 启智 新一代人工智能开源开放平台| 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 天津市能谱科技有限公司-专业的红外光谱仪_红外测油仪_紫外测油仪_红外制样附件_傅里叶红外光谱技术生产服务厂商 | 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 曙光腾达官网-天津脚手架租赁-木板架出租-移动门式脚手架租赁「免费搭设」 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 全自动真空上料机_粉末真空上料机_气动真空上料机-南京奥威环保科技设备有限公司 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 铆钉机|旋铆机|东莞旋铆机厂家|鸿佰专业生产气压/油压/自动铆钉机 | 搪瓷反应釜厂家,淄博搪瓷反应釜-淄博卓耀 | PE一体化污水处理设备_地埋式生活污水净化槽定制厂家-岩康塑业 | 政府回应:200块在义乌小巷能买到爱情吗?——揭秘打工族省钱约会的生存智慧 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 机构创新组合设计实验台_液压实验台_气动实训台-戴育教仪厂 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂_帽子厂_浙江高普制帽厂 | 闪电优家-卫生间防水补漏_酒店漏水渗水维修_防水堵漏公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 光照全温振荡器(智能型)-恒隆仪器 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 万家财经_财经新闻_在线财经资讯网 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 低压载波电能表-单相导轨式电能表-华邦电力科技股份有限公司-智能物联网综合管理平台 | 江苏密集柜_电动_手动_移动_盛隆柜业江苏档案密集柜厂家 | 石英粉,滑石粉厂家,山东滑石粉-莱州市向阳滑石粉有限公司 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 宜兴市恺瑞德环保科技有限公司| 天津蒸汽/热水锅炉-电锅炉安装维修直销厂家-天津鑫淼暖通设备有限公司 | 广西资质代办_建筑资质代办_南宁资质代办理_新办、增项、升级-正明集团 | 金库门,金库房,金库门厂家,金库门价格-河北特旺柜业有限公司 |