資源
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
頁面就會直接被導向登入頁了!