protected function sendrequestthroughrouter($request)
public function __construct(container $container = null)
public function send($passable)
public function through($pipes)
// 中介軟體的本質
public function then(closure $destination)
// 注意這個是子類裡面會呼叫的父carry,區別在於子類加入了異常處理
protected function carry()
elseif (! is_object($pipe)) else
// 中介軟體作用是提供了一種方便的機制來過濾進入應用的 http 請求
// $this->method預設為handle,可通過via方法進行設定
return $pipe->(...$parameters);
};};
}protected function parsepipestring($pipe)
// $parameters為陣列或[param1,param2,param3...]
return [$name, $parameters];
}protected function preparedestination(closure $destination)
;}
前置條件
array_reduce接受三個引數,第乙個引數接收陣列,第二個引數函式名(也可以是匿名函式,函式有兩個引數,分別代表$result和$item),第三個引數(可選),該引數將被當成是陣列中的第乙個值來處理,或者如果陣列為空的話就作為最終返回值。
匿名函式也叫閉包函式(closures),允許臨時建立乙個沒有指定名稱的函式,通過 closure 類來實現的。
當對閉包函式進行賦值時,php 便會自動將此種表示式轉換成內建類 closure 的物件物件在進行賦值。
當閉包函式使用到 use 使用外部資料時,會在 closure 物件生成乙個 static 屬性陣列進行存放。
當閉包函式使用到引數時,會在 closure 物件生成乙個 parameter 屬性陣列進行存放。
public function then(closure $destination)
生成最終匿名函式的過程:
array_reduce執行第一次時得到如下簡化的匿名函式返回,將會繼續作為第乙個引數進行迭代:
第二次:
["pipe"]=>}}
第三次:
}}
依次類推,最終得到乙個匿名函式如下(接受乙個引數,此匿名函式內部使用上面遞迴形式的$pipe和$stack)。
function ($passable) elseif (! is_object($pipe)) else
return $pipe->(...$parameters); // 語法糖模式,因為middleware引數可有可無
};
最終匿名函式的呼叫過程(從最外層開始,這就是前面為什麼要array_reverse,一層一層往裡撥,整體上的處理是:$pipe若是匿名函式,直接呼叫。若是字串,則解析成對應的類和引數,make類,再組成引數陣列。最後呼叫$pipe->handle)
最外層($pipe=illuminate\foundation\http\middleware\checkformaintenancemode):
執行完前置操作後,呼叫$stack($passable),繼續進行下一層
下一層($pipe=illuminate\foundation\http\middleware\validatepostsize):
執行完前置操作後,呼叫$stack($passable),繼續進行下一層
**以此類推,當每層中介軟體的前置任務全部完成,即遞迴執行到最裡面一層(路由分發,解析請求,返回響
應),再由最內層一層一層往回走,執行每層中介軟體的後置任務。至此,返回本次請求的響應。**
最內層(即路由分發,解析請求,返回響應)的操作**展示,後續分析:即執行$destination($passable)匿名函式,位於下面方法中。
protected function preparedestination(closure $destination);}
$destination:
protected function dispatchtorouter()
;}
說明:
所有的後置操作,都是執行到最內層,遞迴往回走時才會執行逐層執行。
laravel中介軟體
自定義中介軟體類,只需要定義乙個handler方法即可,然後我們將主要業務邏輯放在該方法中,如果我們在請求處理前執行業務邏輯,那麼 next閉包執行前執行業務邏輯操作 namespace useclosure class beforemiddleware 如果在請求處理後在執行中介軟體業務邏輯,則在...
Laravel基礎 中介軟體
中介軟體的建立和使用 kernel.php處的中介軟體新增 protected routemiddleware php artisan方式建立中介軟體 php artisan make middleware adminlogin routes.php中介軟體的使用如下 route group mid...
laravel 自定義中介軟體
關於中介軟體的理解 最好將中介軟體想象為一系列的 層 http 請求必須經過它們才會觸發您的應用程式。每一層都可以檢測接收的請求,甚至可以完全拒絕請求訪問您的應用。1.建立中介軟體php artisan make middleware checkage 3.為路由指定中介軟體 route get f...