1. 程式人生 > >lavavel 請求處理通道(中介軟體)

lavavel 請求處理通道(中介軟體)

增加或減少功能需要重新組織相應過程,即例項化的順序,因為這裡例項化過程是手動實現的。手動,我們想到了什麼,對,就是服務容器,在上一節已經講了這個解決依賴注入的自動化裝置,而Laravel框架就是通過服務容器進行自動例項化的,例項間的功能呼叫也是通過閉包函式完成的,這裡為了將問題簡單化,我們通過靜態函式來避免例項化的過程,只模擬通過閉包函式完成裝飾者模式,實現請求的處理管道。在Laravel框架中,針對請求的處理過程一共使用三次處理管道,下面我們先看一段管道程式碼

上面的輸出內容是Laravel框架對請求處理的部分流程,這裡面大部分與上一節中裝飾者模式形式相似,但通過回撥函式生成整個處理流程的過程還是比較難以理解。這裡給一個簡單的例項用於理解,程式碼如下:

這裡我們將處理功能減少為一步,整個程式比較難理解的是array_reduce($steps,"goFun",$prepare)函式和goFun($step,$className)函式,其中array_reduce()函式在引數手冊中介紹是用回撥函式迭代地將陣列內容進行處理,共有三個引數,前兩個引數是必須賦值的,第一個是要處理的陣列,第二個是處理函式名稱或回撥函式,第三個引數為可選引數,為初始化引數,將被當做陣列中第一個值來處理,如果陣列為空則作為返回值。這裡我們給第三個引數傳遞一個回撥函式,該函式用於將請求向路由器繼續傳遞,返回響應,而第一個引數為一個數組,該陣列記錄了外層功能的類名,goFun()函式作為處理陣列的回撥函式。array_reduce()最終返回的是一個回撥函式,即$go,程式碼如下:

$go = function()

{

return $FirstStep::go(function(){echo "請求向路由器傳遞,返回響應".'';});

};

在前面的例子中,通過call_user_func()函式執行這個回撥函式,其實就相當於$go()。這裡我們可以清晰地理解請求處理通道是如何設計出來的。