大家好,今天给大家介绍一下Laravel框架的Pipeline。它是一个非常有用的组件,可以使代码的结构非常清晰。Laravel的中间件机制就是基于它。通过Pipeline,可以轻松实现APO编程。官方GIT地址https://github.com/illuminate...下面的代码是我实际发现的一个简化版本:classPipeline{/***在每个管道上调用的方法*@varstring*/protected$method='处理';/***被传递的对象抛出管道*@varmixed*/protected$passable;/***类管道数组*@vararray*/protected$pipes=[];/***设置通过管道发送的对象**@param$passable*@return$this*/publicfunctionsend($passable){$this->passable=$passable;返回$这个;}/***设置调用管道的方法*@paramarray$pipes*@return$this*/publicfunctionthrough($pipes){$this->pipes=$pipes;返回$这个;}/***@param\Closure$destination*@returnmixed*/publicfunctionthen(\Closure$destination){$pipeline=array_reduce(array_reverse($this->管道),$this->getSlice(),$目的地);返回$pipeline($this->passable);}/***获取代表应用洋葱切片的闭包*@return\Closure*/protectedfunctiongetSlice(){returnfunction($stack,$pipe){returnfunction($request)use($stack,$pipe){return$pipe::{$this->method}($request,$stack);};};}}这种类型的主要逻辑是then和getSlice方法通过array_reduce生成一个接受一个参数的匿名函数,然后执行调用。简单使用示例classALogic{publicstaticfunctionhandle($data,\Clourse$next){print"StartAlogic";$ret=$next($data);打印“结束逻辑”;返回$ret;}}classBLogic{publicstaticfunctionhandle($data,\Clourse$next){print"StartBLogic";$ret=$next($data);打印“结束B逻辑”;返回$ret;}}classCLogic{publicstaticfunctionhandle($data,\Clourse$next){print"BeginCLogic";$ret=$next($data);打印“结束C逻辑”;返回$ret;}}$pipes=[ALogic::class,BLogic::class,CLogic::class];$data="anythings";(newPipeline())->send($data)->through($pipes)->然后(函数($data){打印$data;});运行结果:"StartAlogic""StartBlogic""StartClogic""anythings""EndClogic""EndBlogic""EndAlogic"AOP实例影响其他层级,功能可以很方便的增加或删除。classIpCheck{publicstaticfunctionhandle($data,\Clourse$next){if("IPinvalid"){//IP无效throwException("ipinvalid");}返回$next($data);}}classStatusManage{publicstaticfunctionhandle($data,\Clourse$next){//exec可以执行初始化状态的操作$ret=$next($data)//exec可以执行保存状态信息的操作return$ret;}}$pipes=[IpCheck::class,StatusManage::class,];(newPipeline())->send($data)->through($pipes)->then(function($data){"执行其他逻辑";});
