资讯专栏INFORMATION COLUMN

深入理解 Laravel 管道

paraller / 2349人阅读

摘要:将请求传入到指定的中间件路由。用于处理任务的方法接收两个参数,第一个是一个可传递的对象,第二个是闭包,在运行最后一个管道后对象将被重定向到这个闭包。我希望这个实例能够让你对有更深如的了解,并知道如何使用它们。

这是一篇译文,原文 Understanding Laravel Pipelines。译文首发于 深入理解 Laravel 管道,转载请注明出处。

基本上,你可以使用 laravel 管道(pipelines)基于链式操作将对象传入多个类中执行任何类型的任务,并在所有「任务」执行完成后一次性返回最终结果。

你可以从 Laravel pipelines 获取更多相关知识。

有关管理工作原理的最常见的示例是在框架本身的组件中的使用。我这里说的就是「中间件」。

中间件提供一种方便的机制来过滤发送到应用中的 HTTP 请求...

下面是一个基本的中间件示例:


这些「中间件」实际上就是管道通过接受传入的请求,来处理执行所需的任务。在这里你可以来检测当前接受的请求是一个 HTTP 请求、JSON 请求或任何用户认证等工作。

如果你快速浏览过 IlluminateFoundationHttpKernel 类,你会看到中间件是如何在 Pipeline 对象中被执行的。

/**
  * 将请求传入到指定的 中间件/路由。

  * @param  IlluminateHttpRequest  $request
  * @return IlluminateHttpResponse
  */
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 标签。

也许最终你会构建相关的类来处理这些「任务」。

$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 文档,如果你希望了解更多它是如何工作的 https://laravel.com/api/5.4/Illuminate/Pipeline/Pipeline.html。

在哪用?(Where to use it ?)

这需要靠你去发现... 如果你有任何好的将以请联系我。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29100.html

相关文章

  • Laravel 深入核心系列教程

    摘要:前言年底了不太忙,最近一段时间也一直在研究,就想写篇关于比较深一点的教程系列啥的,于是就找到站长给开了写教程的渠道。优点的就是为艺术家创造的框架,它也是工程化的趋势。项目维护方便也是事实。如果有遇到问题可以直接在教程下面留言。 前言 年底了不太忙,最近一段时间也一直在研究laravel,就想写篇关于laravel比较深一点的教程系列啥的,于是就找到站长给开了写教程的渠道。由于第一次写,...

    wemall 评论0 收藏0
  • laravel框架应用和composer扩展包开发

    摘要:官方地址是目前最流行的框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,框架思想前卫,跟随时代潮流,提倡优雅代码,自称为工匠,其中的模板引擎容器以及扩展包为业务的开发提供了极大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,lara...

    shevy 评论0 收藏0
  • php管道模式手测

    摘要:所以管道模式大致需要三个角色管道,阀门和载荷流水。模仿返回处理后的结果输出结语上面的代码并没有达到中间件的真正执行部分,例子中只是用到了管道模式的一部分。 一直在用Laravel框架,很喜欢laravel框架的中间件。在请求到结果之前,如果我们想要对路由或请求进行额外的处理,简单的加个Midleware中间件就行了,很简单,很方便是不是。最近几天看了下它的中间件的实现方式,把自己的心得...

    zzir 评论0 收藏0
  • Laravel中间件原理

    摘要:直到所有中间件都执行完毕,最后在执行最后的即上述的方法如果上述有地方难懂的,可以参考这边文章内置函数在中的使用以上是在通过全局中间件时的大致流程,通过中间件和路由中间件也是一样的,都是采用管道流操作,详情可翻阅源码 简介 Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求, 如ValidatePostSize用来验证POST请求体大小、ThrottleReque...

    张宪坤 评论0 收藏0
  • Laravel 管道流原理

    摘要:管道流原理强烈依赖函数,我们先来了解下函数的使用。第二次迭代时,的值为上述返回的闭包伪代码,的值为,返回一个闭包,当我们执行这个闭包时,满足,得到结果。自定义中间件为的管道流核心类在的方法中,为上述的闭包,为要通过的中间件数组,为对象。 Laravel管道流原理强烈依赖array_reduce函数,我们先来了解下array_reduce函数的使用。 原标题PHP 内置函数 array_...

    Mr_zhang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<