Featured image of post Day 14. 中介層 Middleware

Day 14. 中介層 Middleware

資源

Laravel7 30天: 目錄
專案連結: github - laravel7 之 30 天分享

前言

專案連結: github - laravel7 之 30 天分享

上一篇: Day 13. 第二個頁面: 個人資料維護
今天來跟大家分享 中介層 - Middleware 先前我們宣告路由直接指向負責的 Controller 以及 Function,
有時候可能會有一些資料的預處理或者是權限的設定
如: 這個頁面需要先登入才能使用 …

這時候就可以使用 middleware 處理這一段 Laravel 也有提供一些預設的 middleware
今天我們先著重聊 middleware 基本設定以及使用
之後在教大家自定義

設定檔

我們可以先看到 /app/Http/Kernel.php 是設定 middleware 的地方
檔案裏面會看到3個 array

全域 middleware

$middleware 這是全域的,只要設定在這每個頁面都會執行

1
2
3
4
5
6
7
8
9
protected $middleware = [
    // \App\Http\Middleware\TrustHosts::class,
    \App\Http\Middleware\TrustProxies::class,
    \Fruitcake\Cors\HandleCors::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

群組 middleware

$middlewareGroups 這是群組的,可以將你設定的 middleware 分群,
就可以不用一個一個使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

官方預設 route/web.php 就吃他的 web 群組,可以參考 /app/Providers/RouteServiceProvider.php 得知

指派給路由的 Middleware

$routeMiddleware 這是設定在路由的,也可以設定在 controller 的 __construct()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
protected $routeMiddleware = [
    'auth' => \App\Http\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,
    'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];

使用

使用的方法有很多種, 我習慣把 middleware 設定在 route,這樣能一目了然知道哪些地方有 middleware
像我們上次編輯個人資料頁,只有登入後才能使用,
這時候可以設定 auth 的 middleware

方法一 (route)

1
2
3
4
Route::group(['prefix' => 'profile', 'as' => 'profile.' ], function() {
    Route::get('/', 'ProfileController@edit')->name('edit');
    Route::post('/', 'ProfileController@update')->name('update');
})->middleware('auth');

方法二 (route)

1
2
3
4
Route::group(['prefix' => 'profile', 'as' => 'profile.', 'middleware' => 'auth' ], function() {
    Route::get('/', 'ProfileController@edit')->name('edit');1
    Route::post('/', 'ProfileController@update')->name('update');
});

方法三 (controller)

1
2
3
4
5
6
7
8
9
class ProfileController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    // ...
}

測試

這時候打開無痕頁面直接執行 /profile 頁面就會直接被導向登入頁了!

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy