laravel5.5中間件

一. 中間件知識

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 () {
    //
});

二. 控制器中間件

中間件 可以在路由文件中被分配給控制器路由:

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);
});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章