Laravel 中间件:路由中间件
问题
我不想注册一个全局中间件,可以只对某个路由注册中间件么?
回答
除了全局中间件,我们也可以针对某个路由注册中间件,具体做法如下:
首先在 app/Http/Kernel.php
文件内为该中间件分配一个键。默认情况下,该类中的 $routeMiddleware
属性下包含了 Laravel 内置的中间件。若要加入自定义的中间件,只需把它附加到列表后并为其分配一个自定义键。例如:
// 在 App\Http\Kernel 类中...
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'my' => \App\Http\Middleware\MyMiddleware::class,
];
我们将 MyMiddleware
注册为路由中间件,并为其指派了一个键名 my
。注册好后,我们就可以通过 middleware
方法为路由分配中间件:
Route::get('my/profile', function () {
//
})->middleware('my');
也可以为路由分配多个中间件:
Route::get('/', function () {
//
})->middleware('first', 'second');
分配中间件时,还可以传递完整的类名:
use App\Http\Middleware\MyMiddleware;
Route::get('my/profile', function () {
//
})->middleware(MyMiddleware::class);
- route 的 group 使用多个中间件摆放顺序有时候需要格外留意
Route::group([ 'middleware' => ['cors', 'auth:api-jwt', 'auth.permission'] ], function () { })
上面代码中使用了3个中间件,每个的顺序都不能颠倒
- cors 前后端分离,如果出现在 auth 后面,一旦出现异常,将会出现跨域现象。
- auth:jwt 判断用户的 token 是否合法,从中可以注入当前用户 Auth::user()
- auth:permission 权限判断,依赖前面的 Auth::user()
想问下中间件中的":"和"."有什么作用?