首頁  >  文章  >  後端開發  >  Laravel管道的深入解析(程式碼)

Laravel管道的深入解析(程式碼)

不言
不言原創
2018-07-23 11:55:441312瀏覽

這篇文章要跟大家分享的內容是關於 Laravel管道的深入解析(程式碼),有一定的參考價值,有需要的朋友可以參考一下。

基本上,你可以使用 laravel 管道(pipelines)基於鍊式操作將物件傳入多個類別中執行任何類型的任務,並在所有「任務」執行完成後一次返回最終結果。

有關管理工作原理的最常見的範例是在框架本身的元件中的使用。我這裡說的就是「中間件」。

中間件提供一個方便的機制來過濾發送到應用中的HTTP 請求...

下面是一個基本的中間件範例:

<?php

namespace App\Http\Middleware;

use Closure;

class TestMiddleware
{
    /**
     * 处理请求
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // 在这里加入你的代码

        return $next($request);
    }
}

這些“中間件」其實就是管道透過接受傳入的請求,來處理執行所需的任務。在這裡你可以來偵測目前接受的請求是一個 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)

考慮這樣的場景。我們需要創建一個允許用戶創建主題和留言功能的論壇系統。但客戶端在它們建立或編輯時要求你自動刪除​​標籤。

以下是你需要做的事情:

  1. 取代文字中的 link 標籤。

  2. 使用「*」取代掉敏感字。

  3. 移除文字中的 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」方法來處理功能。也許透過實作介面程式設計是一個不錯的主意:

<?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)
    {
        // 在这里处理任务,返回待更新的 **$content** 给到下一个管道任务。
        return  $next($content);
    }
}

#用於處理任務的方法接收兩個參數,第一個是一個可傳遞的對象,第二個是閉包,在運行最後一個管道後對象將被重定向到這個閉包。

你也可以自訂方法名稱來取代「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 文檔,如果你希望了解更多它是如何工作的 

相關推薦:

自己搭建一個Laravel 的Docker的開發環境的方法

以上是Laravel管道的深入解析(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn