所属分类:php教程
大家好,今天给大家介绍下Laravel框架的Pipeline。
它是一个非常好用的组件,能够使代码的结构非常清晰。 Laravel的中间件机制便是基于它来实现的。
通过Pipeline,可以轻松实现APO编程。
https://github.com/illuminate...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 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,生成一个接受一个参数的匿名函数,然后执行调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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 ; } } |
1 2 3 4 5 6 7 8 | $pipes = [ ALogic:: class , BLogic:: class , CLogic:: class ]; $data = "any things" ; ( new Pipeline())->send( $data )->through( $pipes )->then( function ( $data ){ print $data ;}); |
1 2 3 4 5 6 7 | "开始 A 逻辑" "开始 B 逻辑" "开始 C 逻辑" "any things" "结束 C 逻辑" "结束 B 逻辑" "结束 A 逻辑" |
AOP 的优点就在于动态的添加功能,而不对其它层次产生影响,可以非常方便的添加或者删除功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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 可以执行初始化状态的操作 $ret = $next ( $data ) // exec 可以执行保存状态信息的操作 return $ret ; } } $pipes = [ IpCheck:: class , StatusManage:: class , ]; ( new Pipeline())->send( $data )->through( $pipes )->then( function ( $data ){ "执行其它逻辑" ;}); |
以上就是Laravel框架中Pipeline的解析(代码示例)的详细内容,更多请关注zzsucai网其它相关文章!