目录列表
本节主要记录路由中间件表现形式,顺带补上多请求类型支持路由。
- 全局中间件
- 路由中间件
- 多请求类型支持
概述
应用官方文档的说明如下:
HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 默认包含了一个中间件来检验用户身份验证,如果用户没有经过身份验证,中间件会将用户导向登录页面,然而,如果用户通过身份验证,中间件将会允许这个请求进一步继续前进。
中间件即处于请求到处理逻辑之间的一种状态。分为前置、后置两种状态,同时涵盖全局与路由两种中间件。
lavarel框架本身已经提供了不少中间件,可以去app/Http/Kernel.php中查阅,下面列出目前存在的一些。
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
如上述代码所示,可以看到两个数组, app/Http/Kernel.php中的 $middleware 数组是全局中间件,也就是说,任何一条路由都会被应用这些中间件,比如里面的CSRF验证中间件。
有时候我们不需要全局中间件,这时候可以将某一个中间件注册至app/Http/Kernel.php文件中的$routeMiddleware数组,数组的键名是中间件的别名,键值是具体的中间件类,如
‘auth’ => ‘App\Http\Middleware\AuthMiddleware’。
具体如何在某一路由上使用特定的中间件我们下文继续。
全局中间件
不做赘述,所有的路由都必经全局中间件的处理。
路由中间件
在route.php中定义如下:
Route::get('test/admin', ['middleware' => 'auth', function()
{
//
}]);
访问http://localhost/test/admin 会自动跳转到登陆页面http://localhost/login
这是就是路由中间件起了作用。
中间件关注点
如下代码是根据Kernel.php中定义的类名拿到的具体实现。 其中$next($request)的使用场景引用如下:
如果在中间件中,通过了你的验证、或者前置的操作逻辑,记得通过代码return $next($request)(上述例子中28行)将请求导向下一个中间件,如果后面没有中间件,就会到的处理逻辑(比如控制器等)。
class Authenticate
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('login');
}
}
return $next($request);
}
}
类型 | 形式 |
---|---|
前置 | 中间件逻辑 -> $next($request) |
后置 | 业务逻辑 -> $next($request) |
多请求类型支持
此处不做赘述,建议阅读源码
Illuminate\Routing\Router.php
包含 any,match等多种路由方法。