Laravel 中介軟體

2021-09-16 23:58:18 字數 3123 閱讀 3144

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...