問題
一個路由需要用到多箇中介軟體,其中一個是 Laravel 自帶的 auth
中介軟體。
發現這個中介軟體不管放在哪裡,總是在自定義中介軟體之前執行。
如果業務需要自定義中間在 auth
之前執行,還是有辦法的。
解決方案
觀察定義中介軟體的 app\Http\Kernel
類,是繼承的 Illuminate\Foundation\Http\Kernel
類。
再開啟 Illuminate\Foundation\Http\Kernel
,發現有這樣一個陣列
...
/**
* The priority-sorted list of middleware.
*
* Forces the listed middleware to always be in the given order.
*
* @var array
*/
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Auth\Middleware\Authenticate::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
...
註釋裡寫得比較清楚了:列表中的中介軟體會按照順序優先在其他中介軟體之前執行。
那麼需要自定義中介軟體在 auth
之前執行,只需要在 app\Http\Kernel
過載這個陣列就行了。
auth
中介軟體對應的類 \Illuminate\Auth\Middleware\Authenticate
,
將自定義中介軟體 \App\Http\Middleware\CustomMiddelware
放到這個前面就可以了:
...
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\CustomMiddelware::class,
\Illuminate\Auth\Middleware\Authenticate::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
...
擴充
不在 $middlewarePriority
列表中的中介軟體,是按照在路由配置裡呼叫的順序來的:
-
在
Route::group
裡定義的,先執行外層,後執行內層 -
在陣列定義的,先執行寫在陣列前面的,後執行寫在陣列後面的
舉例:
Route::group(['middleware' => 'outer'], function () {
Route::group(['middleware' => 'inner'], function () {
Route::group(['middleware' => ['array1', 'array2', 'auth:api']], function () {
Route::get('test', function () {
return;
});
});
});
});
這裡就是按照 outer
、 inner
、 array1
、 array2
的順序執行。
本作品採用《CC 協議》,轉載必須註明作者和本文連結