PHP Pipeline 实现中间件的示例代码(2)
接下来我们添加FastRouter在我的项目中使用。
上面的代码修改成这样
我们接下来看看 RespondJson
里做了什么.
<?php namespace Platapps\Middlewares; class RespondJson { public function __invoke($payload) { header('Content-type:text/json'); return $payload; } }
就简单的加了个 header
我们试试把注释到一个渠道
我们再次访问的时候就变成
当然这是很简单的中间件,这种中间件远远不够,这里是核心代码,可以去这里看看,也比较简单。
我们最终需要修改pipe这个方法
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); } }
这么多框架里面我这里建议拿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; } }
内容版权声明:除非注明,否则皆为本站原创文章。