首頁  >  文章  >  php框架  >  一文了解Laravel中的Pipeline(管道)

一文了解Laravel中的Pipeline(管道)

青灯夜游
青灯夜游轉載
2022-11-16 20:49:571759瀏覽

這篇文章帶大家了解Laravel中的Pipeline(管道),聊聊管道設計範式,希望對大家有幫助!

一文了解Laravel中的Pipeline(管道)

總的來說,透過使用Laravel 中的管道,你能夠流暢地在若干個類別之間傳遞一個對象,從而執行一個任意類型的任務,一旦所有的任務都被執行完,就會將結果值回傳。

接下來,你可以了解更多關於 Laravel pipelines 的知識。

關於管道是運作的方式,最明顯的範例其實就在框架本身最常用的一個元件當中,沒錯,我說的就是中間件。

中間件為過濾進入應用程式的 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(&#39;request&#39;, $request);
    Facade::clearResolvedInstance(&#39;request&#39;);
    $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([&#39;content&#39; => &#39;content&#39;]);
        });
    // 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(&#39;customMethodName&#39;) // <---- This one :)
 ->then(function ($content) {
     return Post::create([&#39;content&#39; => $content]);
 });

#最後產生的效果是什麼?

##提交的內容將會被各個

$pipes 所處理, 被處理的結果將會儲存下來。

$post = app(Pipeline::class)
    ->send($request->all())
    ->through($pipes)
    ->then(function ($content) {
        return Post::create([&#39;content&#39; => $content]);
    });

結語

記住,有很多方法可以解決這類問題。至於如何選擇,就看你自己的選擇了。只要知道一點,需要的時候你可以使用這個工具就可以了。我希望這個例子讓你更好的了解”Laravel pipelines”,以及如何使用它們。如果你想了解或學習更多,可以查看Laravel的API文件

laravel.com/api/5.4/Illuminate/Pip...

原文網址:https: //medium.com/@jeffochoa/understanding-laravel-pipelines-a7191f75c351

翻譯地址:https://learnku.com/laravel/t/7543/pipeline-pipeline-design-paradigm-in-laravel/t/7543/pipeline-pipeline-design-parvelgm-in-lara

【相關推薦:

laravel影片教學

以上是一文了解Laravel中的Pipeline(管道)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除