路由中间件之导语

简介

历经 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 请求为基本请求来进行讲解的,所以路由中间件的类型和数量都取决于此请求。

有哪些中间件呢

file

从图上,我们知道共有一下路由中间件

[
    '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 方法,了解它们实现的作用。

本篇如有错误、不当或者需补充的内容,请各位同僚多提宝贵意见。

本文章首发在 LearnKu.com 网站上。
上一篇 下一篇
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
发起讨论 只看当前版本


暂无话题~