您的位置: 翼速应用 > 业内知识 > PHP框架 > 正文

简析Laravel中的Pipeline设计范式

本文给大家带来了关于laravel的相关知识,简析一下Laravel中的Pipeline,与管道设计范式,下面一起来看一下。


简析Laravel中的Pipeline设计范式



简析Laravel中的Pipeline设计范式


关于管道运行的方式,最明显的范例其实就在框架本身最常用的一个组件当中,没错,就是中间件,中间件为过滤进入应用的 HTTP 请求提供了一个便利的机制。


一个基本的中间件应该是这个样子的:


<?php
namespace App\Http\Middleware;
use Closure;
class TestMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // Here you can add your code
        return $next($request);
    }
}


这些「中间件」实际上就是管道,请求经由这里发送,从而执行任何需要的任务。在这里,你可以检查请求是否是一个 HTTP 请求,是否是一个 JSON 请求,是否存在已认证的用户信息等等。


如果你想快速的查看Illuminate\Foundation\Http\Kernel 类, 你将看到如何使用 Pipeline 类的新实例来执行中间件。


/**
  * Send the given request through the middleware / router.
  *
  * @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());
}


你可以在代码中看到类似的内容:通过中间件列表发送请求的新管道,然后发送路由。


如果这让你看起来有点不知所措也不用担心。让我们试着用以下这个例子来阐明这个概念。


处理多任务运行类


让我们来看一种场景。 比方说,你建立了一个人们可以发帖并发表评论的论坛。但是,您的用户请求您自动删除标签或在创建时在每一个内容上编辑标签。


此时你被要求做的事情如下:


●  用纯文本替换链接标记;


●  用“*”替换敏感词;


●  从内容中完全删除脚本标记。


可能你最终会创建类来处理这些 “tasks”。


$pipes = [
    RemoveBadWords::class
    ReplaceLinkTags::class
    RemoveScriptTags::class
];


我们要做的是将给定的“内容”传递给每个任务,然后将结果返回给下一个任务。我们可以使用pipeline来做到这一点。


<?php
 
public 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”方法来执行操作。也许每个类都有统一的约束是一个不错的选择:


<?php
 
namespace App;
 
use Closure;
 
interface Pipe
{
    public function handle($content, Closure $next);
}

<?php
 
namespace 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设计范式详解就到这里,翼速应用平台内有更多相关资讯,欢迎查阅!


我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题