redirect

1. 中间件知识

1. artisan 命令

php artisan make:middleware CheckAge

2. 文件内容

<?php

namespace App\Http\Middleware;

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 = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        //更多。。。
    ];
  • 特定路由中间件

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

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

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

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,
        \Illuminate\Routing\Middleware\SubstituteBindings::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);
});

分类:

技术点:

相关文章: