摘要:將請求傳入到指定的中間件路由。用于處理任務的方法接收兩個參數,第一個是一個可傳遞的對象,第二個是閉包,在運行最后一個管道后對象將被重定向到這個閉包。我希望這個實例能夠讓你對有更深如的了解,并知道如何使用它們。
這是一篇譯文,原文 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 ?)這需要靠你去發現... 如果你有任何好的將以請聯系我。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29100.html
摘要:前言年底了不太忙,最近一段時間也一直在研究,就想寫篇關于比較深一點的教程系列啥的,于是就找到站長給開了寫教程的渠道。優點的就是為藝術家創造的框架,它也是工程化的趨勢。項目維護方便也是事實。如果有遇到問題可以直接在教程下面留言。 前言 年底了不太忙,最近一段時間也一直在研究laravel,就想寫篇關于laravel比較深一點的教程系列啥的,于是就找到站長給開了寫教程的渠道。由于第一次寫,...
摘要:官方地址是目前最流行的框架,發展勢頭迅猛,應用非常廣泛,有豐富的擴展包可以應付你能想到的各種應用場景,框架思想前衛,跟隨時代潮流,提倡優雅代碼,自稱為工匠,其中的模板引擎容器以及擴展包為業務的開發提供了極大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,發展勢頭迅猛,應用非常廣泛,有豐富的擴展包可以應付你能想到的各種應用場景,lara...
摘要:直到所有中間件都執行完畢,最后在執行最后的即上述的方法如果上述有地方難懂的,可以參考這邊文章內置函數在中的使用以上是在通過全局中間件時的大致流程,通過中間件和路由中間件也是一樣的,都是采用管道流操作,詳情可翻閱源碼 簡介 Laravel 中間件提供了一種方便的機制來過濾進入應用的 HTTP 請求, 如ValidatePostSize用來驗證POST請求體大小、ThrottleReque...
摘要:管道流原理強烈依賴函數,我們先來了解下函數的使用。第二次迭代時,的值為上述返回的閉包偽代碼,的值為,返回一個閉包,當我們執行這個閉包時,滿足,得到結果。自定義中間件為的管道流核心類在的方法中,為上述的閉包,為要通過的中間件數組,為對象。 Laravel管道流原理強烈依賴array_reduce函數,我們先來了解下array_reduce函數的使用。 原標題PHP 內置函數 array_...
閱讀 3300·2021-11-23 09:51
閱讀 2911·2021-10-28 09:33
閱讀 875·2021-10-08 10:04
閱讀 3682·2021-09-22 15:13
閱讀 1016·2019-08-30 15:55
閱讀 2906·2019-08-30 15:44
閱讀 564·2019-08-30 13:04
閱讀 2938·2019-08-30 12:56