laravel5.5中间件 1. 中间件知识 2. 控制器中间件

1. artisan 命令

php artisan make:middleware CheckAge

2. 文件内容

<?php

namespace AppHttpMiddleware;

use Closure;

class CheckAge
{
    public function handle($request, Closure $next)
    {
        if ($request->age <= 200) {
            return redirect('home');
        }
        //还可以进行一些其他的判定
        
        return $next($request);
    }

}

3. 前置中间件和后置中间件

前置中间件和后置中间件区别在于执行动作在$next($request)之前还是之后

//前置中间件
    public function handle($request, Closure $next)
    {
        // 执行动作,在$next($request)之前
        $response = $next($request);
        return $response;
    }
//后置中间件
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // 执行动作在$next($request)之后,return之前

        return $response;
    }

4. 使用中间件

  • 全局中间件

只需在 app/Http/Kernel.php 类中的 $middleware 属性里列出这个中间件类 。

    protected $middleware = [
        IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
        IlluminateFoundationHttpMiddlewareValidatePostSize::class,
        //更多。。。
    ];
  • 特定路由中间件

只需在 app/Http/Kernel.php 类中的 $routeMiddleware 属性里添加,然后在路由中分配给路由

protected $routeMiddleware = [
    'auth' => IlluminateAuthMiddlewareAuthenticate::class,
    'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
    //更多。。。
];
//给路由分配中间件
Route::get('admin/profile', function () {
    //
})->middleware('auth');
//分配多个中间件:
Route::get('/', function () {
    //
})->middleware('first', 'second');
  • 中间件组

只需在 app/Http/Kernel.php 类中的 $middlewareGroups 属性里添加,然后在路由中分配给路由

protected $middlewareGroups = [
    'web' => [
        AppHttpMiddlewareEncryptCookies::class,
        IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
        IlluminateSessionMiddlewareStartSession::class,
        IlluminateViewMiddlewareShareErrorsFromSession::class,
        AppHttpMiddlewareVerifyCsrfToken::class,
        IlluminateRoutingMiddlewareSubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];
//一次为路由分配多个中间件
Route::get('/', function () {
    //
})->middleware('web');

Route::group(['middleware' => ['web']], function () {
    //
});

2. 控制器中间件

中间件 可以在路由文件中被分配给控制器路由:

Route::get('profile', 'UserController@show')->middleware('auth');

但是,在控制器的构造方法中指定中间件会更方便。使用控制器构造函数中的 middleware 方法,你可以很容易地将中间件分配给控制器的行为。你甚至可以约束中间件只对控制器类中的某些特定方法生效:

class UserController extends Controller
{
    /**
     * 实例化一个新的控制器实例。
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');

        $this->middleware('log')->only('index');

        $this->middleware('subscribed')->except('store');
    }
}

还能使用闭包来为控制器注册中间件。闭包的方便之处在于,你无需特地创建一个中间件类来为某一个特殊的控制器注册中间件:

$this->middleware(function ($request, $next) {
    // ...

    return $next($request);
});