Laravel中的Pipeline怎么使用
本文小编为大家详细介绍“Laravel中的Pipeline怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Laravel中的Pipeline怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
关于管道是运行的方式,最明显的范例其实就在框架本身最常用的一个组件当中,没错,我说的就是中间件。
中间件为过滤进入应用的 HTTP 请求提供了一个便利的机制。
一个基本的中间件应该是这个样子的:
<?phpnamespace App\Http\Middleware;use Closure;class TestMiddleware{ public function handle($request, Closure $next) { // Here you can add your code return $next($request); }}
这些「中间件」实际上就是管道,请求经由这里发送,从而执行任何需要的任务。在这里,你可以检查请求是否是一个 HTTP 请求,是否是一个 JSON 请求,是否存在已认证的用户信息等等。
如果你想快速的查看Illuminate\Foundation\Http\Kernel
类, 你将看到如何使用 Pipeline
类的新实例来执行中间件。
protected function sendRequestThroughRouter($request){ $this->app->instance('request', $request); Facade::clearResolvedInstance('request'); $this->bootstrap(); return (new Pipeline($this->app)) ->send($request) ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware) ->then($this->dispatchToRouter());}
你可以在代码中看到类似的内容:通过中间件列表发送请求的新管道,然后发送路由。
如果这让你看起来有点不知所措也不用担心。让我们试着用以下这个例子来阐明这个概念。
处理多任务运行类
让我们来看一种场景。 比方说,你建立了一个人们可以发帖并发表评论的论坛。但是,您的用户请求您自动删除标签或在创建时在每一个内容上编辑标签。
此时你被要求做的事情如下:
用纯文本替换链接标记;
用“*”替换敏感词;
从内容中完全删除脚本标记。
可能你最终会创建类来处理这些 “tasks”。
$pipes = [ RemoveBadWords::class ReplaceLinkTags::class RemoveScriptTags::class];
我们要做的是将给定的“内容”传递给每个任务,然后将结果返回给下一个任务。我们可以使用pipeline来做到这一点。
<?phppublic function create(Request $request){ $pipes = [ RemoveBadWords::class, ReplaceLinkTags::class, RemoveScriptTags::class ]; $post = app(Pipeline::class) ->send($request->content) ->through($pipes) ->then(function ($content) { return Post::create(['content' => 'content']); }); // return any type of response}
每个“task”类应该有一个“handle”方法来执行操作。也许每个类都有统一的约束是一个不错的选择:
<?phpnamespace App;use Closure;interface Pipe{ public function handle($content, Closure $next);}
命名是个困难的事情 ¯_(ツ)_/¯
<?phpnamespace App;use Closure;class RemoveBadWords implements Pipe{ public function handle($content, Closure $next) { // Here you perform the task and return the updated $content // to the next pipe return $next($content); }}
用于执行任务的方法应该接收两个参数,第一个参数是合格的对象,第二个参数是当前操作处理完后会接管的下一个闭包(匿名函数)。
您可以使用自定义方法名称而不是“handle”。然后你需要指定pipeline要使用的方法名称,比如:
app(Pipeline::class) ->send($content) ->through($pipes) ->via('customMethodName') // <---- This one :) ->then(function ($content) { return Post::create(['content' => $content]); });
最后产生的效果是什么 ?
提交的内容将会被各个$pipes
所处理, 被处理的结果将会存储下来。
$post = app(Pipeline::class) ->send($request->all()) ->through($pipes) ->then(function ($content) { return Post::create(['content' => $content]); });
读到这里,这篇“Laravel中的Pipeline怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341