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

首頁 > 編程 > PHP > 正文

關于PHP管道插件 League-Pipeline的解析

2020-03-24 18:57:15
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了 關于PHP管道插件 League/Pipeline的解析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

Pipeline 設計模式

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

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

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

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

gulp

第一次知道「pipe」的概念,來自 gulp 的使用。

2345389398-5b41fe82a2f49_articlex[1].jpg

gulp 是基于 NodeJS 的自動任務運行器,她能自動化地完成Javascript、sass、less 等文件的測試、檢查、合并、壓縮、格式化、瀏覽器自動刷新、部署文件生成,并監聽文件在改動后重復指定的這些步驟。在實現上,她借鑒了 Unix 操作系統的管道 (pipe) 思想,前一級的輸出,直接變成后一級的輸入,使得在操作上非常簡單。

var gulp = require( gulp var less = require( gulp-less var minifyCSS = require( gulp-csso var concat = require( gulp-concat var sourcemaps = require( gulp-sourcemaps 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 ]);

上面的兩個 task 主要是將 less、所有 js 文件進行解析、壓縮、輸出等流程操作,然后存到對應的文件夾下;每一步操作的輸出就是下一步操作的輸入,猶如管道的流水一般。

IlluminatePipeline

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

寫個 demo

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;}


2813075353-5b41fe828b89f_articlex[1].jpg

1963707121-5b41fe828b898_articlex[1].jpg

對于該源碼的分析,可以推薦看這篇文章,分析的挺透徹了:

Laravel Pipeline 組件的實現 https://www.insp.top/article/realization-of-pipeline-component-for-laravelLeaguePipeline

上面對 gulp 和 Illuminate/Pipeline 的簡單使用,只是告訴我們「Pipeline」應用比較廣泛。如果讓我們自己也寫一個類似的插件出來呢,我想應該也不是很難。

下面我拿 League/Pipeline 插件來扒一扒它的源代碼,看如何實現的。

簡述

This package provides a plug and play implementation of the Pipeline Pattern. It’s an architectural pattern which encapsulates sequential processes. When used, it allows you to mix and match operation, and pipelines, to create new execution chains. The pipeline pattern is often compared to a production line, where each stage performs a certain operation on a given payload/subject. Stages can act on, manipulate, decorate, or even replace the payload.

If you find yourself passing results from one function to another to complete a series of tasks on a given subject, you might want to convert it into a pipeline.

https://pipeline.thephpleague.com/

安裝插件

composer require league/pipeline

寫個 demo

use League/Pipeline/Pipeline;// 創建兩個閉包函數$pipe1 = function ($payload) { return $payload + 1;$pipe2 = function ($payload) { return $payload * 3;$route- map( GET , /demo , function (ServerRequestInterface $request, ResponseInterface $response ) use ($service, $pipe1, $pipe2) { $params = $request- getQueryParams(); // 正常使用 $pipeline1 = (new Pipeline) - pipe($pipe1) - pipe($pipe2); $callback1 = $pipeline1- process($params[ data  $response- getBody()- write( h1 正常使用 /h1  $response- getBody()- write( p 結果:$callback1 /p  // 使用魔術方法 $pipeline2 = (new Pipeline()) - pipe($pipe1) - pipe($pipe2); $callback2 = $pipeline2($params[ data  $response- getBody()- write( h1 使用魔術方法 /h1  $response- getBody()- write( p 結果:$callback2 /p  // 使用 Builder $builder = new PipelineBuilder(); $pipeline3 = $builder - add($pipe1) - add($pipe2) - build(); $callback3 = $pipeline3($params[ data  $response- getBody()- write( h1 使用 Builder /h1  $response- getBody()- write( p 結果:$callback3 /p  return $response;);

運行結果

1723416169-5b41fe827c09f_articlex[1].jpg

326071107-5b41fe827cbbf_articlex[1].jpg

解讀源代碼

整個插件就這幾個文件:

3505418101-5b41fe826b0d6_articlex[1].jpg

PipelineInterface

 ?phpdeclare(strict_types=1);namespace League/Pipeline;interface PipelineInterface extends StageInterface * Create a new pipeline with an appended stage. * @return static public function pipe(callable $operation): PipelineInterface;interface StageInterface * Process the payload. * @param mixed $payload * @return mixed public function __invoke($payload);}

該接口主要是利用鏈式編程的思想,不斷添加管道「pipe」,然后增加一個魔術方法,來讓傳入的參數運轉起來。

先看看這個魔術方法的作用:

mixed __invoke ([ $... ] )
當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用。

如:

 ?phpclass CallableClass  function __invoke($x) { var_dump($x);$obj = new CallableClass;$obj(5);var_dump(is_callable($obj));? 

返回結果:

int(5)bool(true)

Pipeline

 ?phpdeclare(strict_types=1);namespace League/Pipeline;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);}

其中核心類 Pipeline 的作用主要就是兩個:

添加組裝各個管道「pipe」;

組裝后,引水流動,執行 process($payload),輸出結果。

Processor

接好各種管道后,那就要「引水入渠」了。該插件提供了兩個基礎執行類,比較簡單,直接看代碼就能懂。

// 按照 $stages 數組順利,遍歷執行管道方法,再將結果傳入下一個管道,讓「水」一層層「流動」起來class FingersCrossedProcessor implements ProcessorInterface public function process($payload, callable ...$stages) foreach ($stages as $stage) { $payload = $stage($payload); return $payload;// 增加一個額外的「過濾網」,經過每個管道后的結果,都需要 check,一旦滿足則終止,直接輸出結果。class InterruptibleProcessor implements ProcessorInterface * @var callable private $check; public function __construct(callable $check) $this- check = $check; public function process($payload, callable ...$stages) $check = $this- check; foreach ($stages as $stage) { $payload = $stage($payload); if (true !== $check($payload)) { return $payload; return $payload;interface ProcessorInterface * Process the payload using multiple stages. * @param mixed $payload * @return mixed public function process($payload, callable ...$stages);}

我們完全也可以利用該接口,實現我們的方法來組裝管道和「過濾網」。

PipelineBuilder

最后提供了一個 Builder,這個也很好理解:

class PipelineBuilder implements PipelineBuilderInterface * @var callable[] private $stages = []; * @return self public function add(callable $stage): PipelineBuilderInterface $this- stages[] = $stage; return $this; public function build(ProcessorInterface $processor = null): PipelineInterface return new Pipeline($processor, ...$this- stages);interface PipelineBuilderInterface * Add an stage. * @return self public function add(callable $stage): PipelineBuilderInterface; * Build a new Pipeline object. public function build(ProcessorInterface $processor = null): PipelineInterface;}
總結

無論是對不同技術的橫向理解,還是基于 Laravel 或者某些開源插件,我們都能學習到技術之上的通用原理和方法。再將這些原理和方法反作用于我們的實際代碼開發中。

最近閑來沒事,自己參考 Laravel 去寫個簡易框架,也將League/Pipeline 引入到框架中使用。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !

相關推薦:

關于PHP開發中遇到的一些錯誤的解決方法

關于利用Vue-laravel前端和后端分離寫一個博客的方法

以上就是關于PHP管道插件 League/Pipeline的解析的詳細內容,PHP教程

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
青青草成人在线| 亚洲精品在线不卡| 国产亚洲精品久久久优势| 91精品久久久久久久久久入口| 久久99青青精品免费观看| 欧美中文字幕在线视频| 精品久久久一区二区| 国产精品久久久久久久久| 欧美区在线播放| 国产一区二区黑人欧美xxxx| 日韩三级成人av网| 欧美成人午夜剧场免费观看| 日本高清视频精品| 欧美在线视频一区二区| 欧美高清第一页| 亚洲人成啪啪网站| 欧美日韩成人在线播放| 欧美中文字幕在线| 国产精品色视频| 日韩黄色在线免费观看| 久久久国产在线视频| 川上优av一区二区线观看| 91久久精品国产91性色| 91国产精品91| 国内精品久久久久伊人av| 国产精品99久久久久久白浆小说| 国产精品91在线观看| 精品国产乱码久久久久久虫虫漫画| 欧美性xxxxx极品娇小| 日韩视频免费在线观看| 国产亚洲视频在线| 欧美日韩久久久久| 国产精品久久一区主播| 亚洲男人的天堂在线| 亚洲毛片一区二区| 国产精品高潮呻吟久久av无限| 91久久精品美女| 在线日韩日本国产亚洲| 亚洲精品黄网在线观看| 久久精品成人欧美大片古装| 国产精品极品美女粉嫩高清在线| 欧美在线亚洲在线| 奇门遁甲1982国语版免费观看高清| 久久噜噜噜精品国产亚洲综合| 欧美限制级电影在线观看| 亚洲精品动漫久久久久| 亚洲美女av网站| 欧美猛少妇色xxxxx| 国产视频丨精品|在线观看| 国产成人av在线| 精品中文视频在线| 色妞久久福利网| 欧美怡红院视频一区二区三区| 国产福利精品在线| 久久91亚洲精品中文字幕奶水| 26uuu亚洲国产精品| 成人有码在线播放| 亚洲色图激情小说| 91精品视频在线播放| 国产成人福利夜色影视| 亚洲女人天堂成人av在线| 欧美一区视频在线| 亚洲一区二区久久久久久久| 成人久久一区二区三区| 91国偷自产一区二区三区的观看方式| 欧美自拍视频在线| 5252色成人免费视频| 国产色视频一区| 亚洲国产精品成人av| 亚洲韩国欧洲国产日产av| 丝袜情趣国产精品| 欧美成人三级视频网站| 国内精品久久久久伊人av| 亚洲免费一在线| 少妇精69xxtheporn| 热久久这里只有精品| 亚洲欧美制服第一页| 亚洲午夜未删减在线观看| 久久成人免费视频| 黑人狂躁日本妞一区二区三区| 久久中国妇女中文字幕| 日本a级片电影一区二区| 91在线免费看网站| 久久久久久久久久久久久久久久久久av| 成人免费高清完整版在线观看| 欧美激情视频在线观看| 国产精品久久av| 亚洲欧美在线一区| 在线播放亚洲激情| 久久久亚洲网站| 欧美激情va永久在线播放| 欧美成人久久久| 少妇久久久久久| 亚洲欧美精品伊人久久| 国产精品九九九| 欧美性xxxx极品高清hd直播| 日本久久久a级免费| 国产精欧美一区二区三区| 国产精品久久久久久av下载红粉| 亚洲第一区中文99精品| 国产精品男女猛烈高潮激情| 国产一区香蕉久久| 亚洲三级免费看| 国产精品精品久久久久久| 九色91av视频| 麻豆国产精品va在线观看不卡| 欧美怡春院一区二区三区| 日韩精品视频免费| xxxxx成人.com| 91九色蝌蚪国产| 国产精品无av码在线观看| 国产亚洲视频中文字幕视频| 欧亚精品中文字幕| 日韩av免费在线观看| 国产精品免费视频xxxx| 中文精品99久久国产香蕉| 97免费在线视频| 国产午夜精品久久久| 国产精品第一页在线| 国产精品人成电影在线观看| 成人精品网站在线观看| 91香蕉嫩草神马影院在线观看| 国产福利精品视频| 一本一道久久a久久精品逆3p| 揄拍成人国产精品视频| www.欧美免费| 国产aⅴ夜夜欢一区二区三区| 国内精品免费午夜毛片| 日韩在线观看免费全| 91嫩草在线视频| 4p变态网欧美系列| 成人两性免费视频| 日韩精品免费一线在线观看| 最近2019年好看中文字幕视频| 777国产偷窥盗摄精品视频| 欧美精品在线免费观看| 国产激情综合五月久久| 国产精品69久久久久| 亚洲午夜久久久久久久| 日韩在线中文字幕| 欧美精品video| 国产成人亚洲精品| 国产成人精品av在线| 亚洲第一二三四五区| 国产精品一区二区3区| 深夜成人在线观看| 国产亚洲精品久久久久久牛牛| 国产在线播放不卡| 亚洲毛片一区二区| 国内精品久久久久影院 日本资源| 欧美成人亚洲成人日韩成人| 久久频这里精品99香蕉| 91在线免费视频| 国产精品精品一区二区三区午夜版| 国产一区二区在线免费| 午夜精品免费视频| 欧美精品一区二区免费| 欧美一级片一区| 欧美午夜片在线免费观看| 成人福利在线视频| 欧美国产日韩二区| 国产视频久久久| 日韩激情片免费| 亚洲欧美福利视频|