【laravel路由总结】中间件及多请求类型支持

    2016年07月29日 doc php 字数:1917

目录列表

本节主要记录路由中间件表现形式,顺带补上多请求类型支持路由。

  • 全局中间件
  • 路由中间件
  • 多请求类型支持

概述

应用官方文档的说明如下:

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等多种路由方法。