这篇文章给大家分享的内容是关于 laravel管道的深入解析(代码),有一定的参考价值,有需要的朋友可以参考一下。
基本上,你可以使用 laravel 管道(pipelines)基于链式操作将对象传入多个类中执行任何类型的任务,并在所有「任务」执行完成后一次性返回最终结果。
有关管理工作原理的最常见的示例是在框架本身的组件中的使用。我这里说的就是「中间件」。
中间件提供一种方便的机制来过滤发送到应用中的 HTTP 请求...
下面是一个基本的中间件示例:
这些「中间件」实际上就是管道通过接受传入的请求,来处理执行所需的任务。在这里你可以来检测当前接受的请求是一个 HTTP 请求、JSON 请求或任何用户认证等工作。
如果你快速浏览过 Illuminate\Foundation\Http\Kernel 类,你会看到中间件是如何在 Pipeline 对象中被执行的。
/** * 将请求传入到指定的 中间件/路由。 * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ 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()); }你可以从这段代码中看到:pipeline 实例将请求发送到一组中间件中,并将其分发到路由器。
如果这段代码对你来说有些手足无措的话请不用担心。我将以一些实例来阐明它的相关概念。
在类中运行多个任务(Working on a class that requires to run multiple tasks)
考虑一下这样的场景。我们需要创建一个允许用户创建话题和留言功能的论坛系统。但客户端在它们创建或编辑时要求你自动删除标签。
下面是你需要做的事情:
替换文本中的 link 标签。
使用「*」替换掉敏感词。
移除文本中的 script 标签。
也许最终你会构建相关的类来处理这些「任务」。
ZYCH自由策划企业网站管理系统06 Build210109下载ZYCH自由策划企业网站管理系统是一个智能ASP网站管理程序,是基于自由策划企业网站系列的升级版,结合以往版本的功能优势,解决了频道模板不能自由添加删减的问题,系统开发代码编写工整,方便读懂,系统采用程序模板分离式开发。方便制作模板后台模板切换,模板采用动态编写,此模板方式写入快,代码编写自由,即能满足直接使用也能满足二次开发。全新的后台界面,不管是在程序的内部结构还是界面风格及CSS上都做了大量
$pipes = [ RemoveBadWords::class ReplaceLinkTags::clas RemoveScriptTags::class ];我们要做的就是将我们的「内容」依次传入每个任务,然后将上一个任务处理结果传入到下一个任务。我们可以使用管道来处理这个任务。
public function create(Request $request) { $pipes = [ RemoveBadWords::class, ReplaceLinkTags::class, RemoveScriptTags::class ]; $post = app(Pipeline::class) ->send($request) ->through($pipes) ->then(function ($content) { return Post::create(['content' => $content]); }); // 返回响应 }每个「任务」类都需要定义一个「handle」方法来处理功能。也许通过实现接口编程是一个不错的主意:
命名好难啊 ¯_(ツ)_/¯*
用于处理任务的方法接收两个参数,第一个是一个可传递的对象,第二个是闭包,在运行最后一个管道后对象将被重定向到这个闭包。
你也可以自定义方法名来替代「handle」方法名。然后您需要指定管道要使用的方法名,就像这样:
app(Pipeline::class) ->send($content) ->through($pipes) ->via('customMethodName') // <---- 就是这个 :) ->then(function ($content) { return Post::create(['content' => $content]); });最后发生了什么?(What happens at the end ?)
这里应该发生的是提交的内容将会被每个 $pipes 修改,最终的返回的内容将被保存。
$post = app(Pipeline::class) ->send($request->all()) ->through($pipes) ->then(function ($content) { return Post::create(['content' => $content]); });结束语(Final words)
记住, 有很多方法可以处理这种类型的问题。如何选择取决于你。但是值得高兴的是在你的知识库中在需要的时候已经建立了管道这个新的武器的知识。
我希望这个实例能够让你对「Laravel Pipelines」有更深如的了解,并知道如何使用它们。
你也可以去查看 laravel api 文档,如果你希望了解更多它是如何工作的
相关推荐:










