路由中间件之导语
简介
历经 4 章的漫途路程,我们终于将 路由调度 的逻辑实现捋了一遍。
现在我们又一次站在了 Pipeline 管道操作的大门口
protected function runRouteWithinStack(Route $route, Request $request)
{
$shouldSkipMiddleware = $this->container->bound('middleware.disable') &&
$this->container->make('middleware.disable') === true;
$middleware = $shouldSkipMiddleware ? [] : $this->gatherRouteMiddleware($route);
// Pipeline 管道操作的大门口
return (new Pipeline($this->container))
->send($request)
->through($middleware)
->then(function ($request) use ($route) {
return $this->prepareResponse(
$request, $route->run()
);
});
}
关于 Pipeline 管道操作的实现,请移步相关章节 ---> 传送门
关于接下来的内容
本大章节我们将直接对 各路由中间件 的作用和实现进行分析,需要 7 章进行讲解。
为什么要 7 章呢
因为本次请求所涉及的路由中间件有 7 个。
路由中间件的数量并不是一成不变的,其数量是根据你在配置路由和控制器时,定义中间件时所决定的。由于本教程依托 http://localhost/register
GET 请求为基本请求来进行讲解的,所以路由中间件的类型和数量都取决于此请求。
有哪些中间件呢
从图上,我们知道共有一下路由中间件
[
'App\Http\Middleware\EncryptCookies',
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
'Illuminate\Session\Middleware\StartSession',
'Illuminate\View\Middleware\ShareErrorsFromSession',
'App\Http\Middleware\VerifyCsrfToken',
'Illuminate\Routing\Middleware\SubstituteBindings',
'App\Http\Middleware\RedirectIfAuthenticated',
]
那么这些中间件又是来自哪里呢?
- 前 6 个来自 web 路由中间组
- 最后 1 个来自 guest 单词标识的路由中间件
关于 web 路由中间组
App\Http\Kernel
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
看到这段属性声明吗,web 键所指的 6 个中间件就是上面的前 6 个中间件。
关于 guest 中间件
我们到 RegisterController 控制器中,看一下它的构造函数就知道了
App\Http\Controllers\Auth\RegisterController
public function __construct()
{
$this->middleware('guest');
}
看到没,声明了中间件 guest。
那它所执行的中间件在哪里?
我们回到 Kernel
App\Http\Kernel
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\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,
];
看到 guest 键了吗,其指向的 \App\Http\Middleware\RedirectIfAuthenticated::class
就是上面最后一个中间件。
最后
路由中间件的由来,我们已经讲明白了,下面几章,我们将正式进入这 7 个中间件中,明确来说,是读懂它们的 handle 方法,了解它们实现的作用。