這篇文章給大家分享的內容是關於 Laravel管道的深入解析(代碼),有一定的參考價值,有需要的朋友可以參考一下。
基本上,你可以使用 laravel 管道(pipelines)基於鏈式操作將對象傳入多個類中執行任何類型的任務,並在所有「任務」執行完成後一次性返回最終結果。
有關管理工作原理的最常見的樣本是在架構本身的組件中的使用。我這裡說的就是「中介軟體」。
中介軟體提供一種方便的機制來過濾發送到應用中的 HTTP 要求...
下面是一個基本的中介軟體樣本:
<?phpnamespace 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)
考慮一下這樣的情境。我們需要建立一個允許使用者建立話題和留言功能的論壇系統。但用戶端在它們建立或編輯時要求你自動刪除標籤。
下面是你需要做的事情:
替換文本中的 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」方法來處理功能。也許通過實現介面編程是一個不錯的主意:
<?phpnamespace App;use Closure;interface Pipe{ public function handle($content, Closure $next);}
<?phpnamespace 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 文檔,如果你希望瞭解更多它是如何工作的