摘要:將請求傳入到指定的中間件路由。用于處理任務(wù)的方法接收兩個參數(shù),第一個是一個可傳遞的對象,第二個是閉包,在運行最后一個管道后對象將被重定向到這個閉包。我希望這個實例能夠讓你對有更深如的了解,并知道如何使用它們。
這是一篇譯文,原文 Understanding Laravel Pipelines。譯文首發(fā)于 深入理解 Laravel 管道,轉(zhuǎn)載請注明出處。
基本上,你可以使用 laravel 管道(pipelines)基于鏈?zhǔn)讲僮鲗ο髠魅攵鄠€類中執(zhí)行任何類型的任務(wù),并在所有「任務(wù)」執(zhí)行完成后一次性返回最終結(jié)果。
你可以從 Laravel pipelines 獲取更多相關(guān)知識。
有關(guān)管理工作原理的最常見的示例是在框架本身的組件中的使用。我這里說的就是「中間件」。
中間件提供一種方便的機(jī)制來過濾發(fā)送到應(yīng)用中的 HTTP 請求...
下面是一個基本的中間件示例:
這些「中間件」實際上就是管道通過接受傳入的請求,來處理執(zhí)行所需的任務(wù)。在這里你可以來檢測當(dāng)前接受的請求是一個 HTTP 請求、JSON 請求或任何用戶認(rèn)證等工作。
如果你快速瀏覽過 IlluminateFoundationHttpKernel 類,你會看到中間件是如何在 Pipeline 對象中被執(zhí)行的。
/** * 將請求傳入到指定的 中間件/路由。 * @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 實例將請求發(fā)送到一組中間件中,并將其分發(fā)到路由器。
如果這段代碼對你來說有些手足無措的話請不用擔(dān)心。我將以一些實例來闡明它的相關(guān)概念。
在類中運行多個任務(wù)(Working on a class that requires to run multiple tasks)考慮一下這樣的場景。我們需要創(chuàng)建一個允許用戶創(chuàng)建話題和留言功能的論壇系統(tǒng)。但客戶端在它們創(chuàng)建或編輯時要求你自動刪除標(biāo)簽。
下面是你需要做的事情:
替換文本中的 link 標(biāo)簽。
使用「*」替換掉敏感詞。
移除文本中的 script 標(biāo)簽。
也許最終你會構(gòu)建相關(guān)的類來處理這些「任務(wù)」。
$pipes = [ RemoveBadWords::class ReplaceLinkTags::clas RemoveScriptTags::class ];我們要做的就是將我們的「內(nèi)容」依次傳入每個任務(wù),然后將上一個任務(wù)處理結(jié)果傳入到下一個任務(wù)。我們可以使用管道來處理這個任務(wù)。
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]); }); // 返回響應(yīng) }每個「任務(wù)」類都需要定義一個「handle」方法來處理功能。也許通過實現(xiàn)接口編程是一個不錯的主意:
命名好難啊 ˉ_(ツ)_/ˉ*
用于處理任務(wù)的方法接收兩個參數(shù),第一個是一個可傳遞的對象,第二個是閉包,在運行最后一個管道后對象將被重定向到這個閉包。
你也可以自定義方法名來替代「handle」方法名。然后您需要指定管道要使用的方法名,就像這樣:
app(Pipeline::class) ->send($content) ->through($pipes) ->via("customMethodName") // <---- 就是這個 :) ->then(function ($content) { return Post::create(["content" => $content]); });最后發(fā)生了什么?(What happens at the end ?)這里應(yīng)該發(fā)生的是提交的內(nèi)容將會被每個 $pipes 修改,最終的返回的內(nèi)容將被保存。
$post = app(Pipeline::class) ->send($request->all()) ->through($pipes) ->then(function ($content) { return Post::create(["content" => $content]); });結(jié)束語(Final words)記住, 有很多方法可以處理這種類型的問題。如何選擇取決于你。但是值得高興的是在你的知識庫中在需要的時候已經(jīng)建立了管道這個新的武器的知識。
我希望這個實例能夠讓你對「Laravel Pipelines」有更深如的了解,并知道如何使用它們。
你也可以去查看 laravel api 文檔,如果你希望了解更多它是如何工作的 https://laravel.com/api/5.4/Illuminate/Pipeline/Pipeline.html。
在哪用?(Where to use it ?)這需要靠你去發(fā)現(xiàn)... 如果你有任何好的將以請聯(lián)系我。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29100.html
摘要:前言年底了不太忙,最近一段時間也一直在研究,就想寫篇關(guān)于比較深一點的教程系列啥的,于是就找到站長給開了寫教程的渠道。優(yōu)點的就是為藝術(shù)家創(chuàng)造的框架,它也是工程化的趨勢。項目維護(hù)方便也是事實。如果有遇到問題可以直接在教程下面留言。 前言 年底了不太忙,最近一段時間也一直在研究laravel,就想寫篇關(guān)于laravel比較深一點的教程系列啥的,于是就找到站長給開了寫教程的渠道。由于第一次寫,...
摘要:官方地址是目前最流行的框架,發(fā)展勢頭迅猛,應(yīng)用非常廣泛,有豐富的擴(kuò)展包可以應(yīng)付你能想到的各種應(yīng)用場景,框架思想前衛(wèi),跟隨時代潮流,提倡優(yōu)雅代碼,自稱為工匠,其中的模板引擎容器以及擴(kuò)展包為業(yè)務(wù)的開發(fā)提供了極大的便利。 laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,發(fā)展勢頭迅猛,應(yīng)用非常廣泛,有豐富的擴(kuò)展包可以應(yīng)付你能想到的各種應(yīng)用場景,lara...
摘要:直到所有中間件都執(zhí)行完畢,最后在執(zhí)行最后的即上述的方法如果上述有地方難懂的,可以參考這邊文章內(nèi)置函數(shù)在中的使用以上是在通過全局中間件時的大致流程,通過中間件和路由中間件也是一樣的,都是采用管道流操作,詳情可翻閱源碼 簡介 Laravel 中間件提供了一種方便的機(jī)制來過濾進(jìn)入應(yīng)用的 HTTP 請求, 如ValidatePostSize用來驗證POST請求體大小、ThrottleReque...
摘要:管道流原理強(qiáng)烈依賴函數(shù),我們先來了解下函數(shù)的使用。第二次迭代時,的值為上述返回的閉包偽代碼,的值為,返回一個閉包,當(dāng)我們執(zhí)行這個閉包時,滿足,得到結(jié)果。自定義中間件為的管道流核心類在的方法中,為上述的閉包,為要通過的中間件數(shù)組,為對象。 Laravel管道流原理強(qiáng)烈依賴array_reduce函數(shù),我們先來了解下array_reduce函數(shù)的使用。 原標(biāo)題PHP 內(nèi)置函數(shù) array_...
閱讀 3312·2021-11-23 09:51
閱讀 2935·2021-10-28 09:33
閱讀 895·2021-10-08 10:04
閱讀 3704·2021-09-22 15:13
閱讀 1028·2019-08-30 15:55
閱讀 2918·2019-08-30 15:44
閱讀 577·2019-08-30 13:04
閱讀 2946·2019-08-30 12:56