# 前言
我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。
# 版本
# 目錄
# Introduction
Laravel 中, 哪個地方可以找到所有的 Middleware?
app/Http/Middleware
資料夾
# Defining Middleware
以下的 Laravel command example code 的意思是?
- Example:
php artisan make:middleware MiddewareName
- Answer: 使用 CLI 建立一個 middleware
請解釋以下的 Laravel Middleware example 邏輯
- Example
<?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);
}
}
- Answer: 如果 age 小於 200, 重導到 home route 去 如果 age 大於 200, 通過此 middleware
如果 request 沒有通過 middleware, 可以到達 route 嗎?
不行
# Before & After Middleware
以下的 Laravel example code 的意思是?
- Example:
<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// Perform action
return $response;
}
}
- Answer: 定義一個 middleware, 先取得 $response, 因此 $request 會先由 $next pass 到 controller, 因此順序上會先執行 Controller 的邏輯, 在執行 middleware 的邏輯
以下的 Laravel example code 的意思是?
- Example:
<?php
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
public function handle($request, Closure $next)
{
// Perform action
return $next($request);
}
}
- Answer: 定義一個 middleware, 順序上會先執行 middleware 邏輯, 再由 $next method 將 $request 帶過去 Controller 那
# Registering Middleware
# Global Middleware
如果我要定義一個 Global Middleware, 也就是每一個 HTTP request 都會通過它, 那我可以在 哪一個檔案
的 哪一個 property
中加入此 middleware?
app/Http/Kernel.php
$middleware
# Assigning Middleware To Routes
如果我要定義一個 middleware, 並把它分配給特定的 route, 那我應該在 哪個檔案
中的 哪個 property
去定義?
App\Http\Kernel.php
$routeMiddleware
以下的 Laravel middleware register example 主要用在什麼地方?
- Example:
<?php
// Within App\Http\Kernel Class...
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,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
- Answer: 註冊在 $routeMiddleware property 中的 middleware, 可視專案需求使用在特定的 route 上
以下的 Laravel example code 的意思是?
- Example:
<?php
Route::get('/', function () {
//
})->middleware('first', 'second');
- Answer: 在這個 route 使用 ‘first’, ‘second’ 兩個 middleware
以下的 Laravel example code 的意思是?
- Example:
<?php
use App\Http\Middleware\CheckAge;
Route::get('admin/profile', function () {
//
})->middleware(CheckAge::class);
- Answer: 以 class name 的方式給這個 route 指派一個 middleware, 任何經過此 route 的 request 都會經過此 middleware
# Middleware Groups
Laravel 中, 如果我想要註冊一個 Middleware Group, 該 Group 中可以有多個 Middleware, 而我只需要 assign 這個 group 就等於一次性的附加內含的所有 middleware, 那我可以在 哪一個檔案
中的 哪一個 propery
註冊這個 Middleware Group?
app\Http\Kernel.php
$middlewareGroups
Laravel 中, 當我使用 /routes/web.php 時, 默認會使用哪一個 Middleware Group?
web
# Sorting Middleware
Laravel 中, 如果我要定義 middleware 執行的順序, 我可以在 哪個
檔案定義?
app/Http/Kernel.php
Laravel 中, 如果我要定義 middleware 執行的順序, 我可以在 app/Http/Kernel.php
中的哪個 property 定義?
$middlewarePriority
# Middleware Parameters
以下的 Laravel example code 的意思是?
- Example:
<?php
namespace App\Http\Middleware;
use Closure;
class CheckRole
{
public function handle($request, Closure $next, $role)
{
if (! $request->user()->hasRole($role)) {
// Redirect...
}
return $next($request);
}
}
- Answer: 從外部帶入 $role parameter 來供 middleware 使用
以下的 Laravel example code 的意思是?
- Example:
<?php
Route::put('post/{id}', function ($id) {
//
})->middleware('role:editor,author');
- Answer: 將 editor 以及 author 以 role middleware 參數的形式帶入
# Terminable Middleware
以下的 Laravel example code 的意思是?
- Example:
<?php
namespace Illuminate\Session\Middleware;
use Closure;
class StartSession
{
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
// Do something here
}
}
- Answer: 在 StartSession middleware 當中, 定義了 terminate method, 當 return response 之後, 會執行 terminate method 當中的邏輯
Laravel 中, 當我定義好一個 middleware 之後, 有哪幾種註冊方式?
- global 註冊
- route 註冊
- middleware group 註冊
Laravel 中, 當我呼叫 middleware 的 terminate method, 預設會取得原本的那一個 middleware instance 還是一個新的 instance?
新的
以下的 Laravel 程式碼的意思是?
- Example:
<?php
use App\Http\Middleware\TerminableMiddleware;
public function register()
{
$this->app->singleton(TerminableMiddleware::class);
}
- Answer: 在 AppServiceProvider 的 register method 中使用 singleton method, 這樣一來, 每次的 terminate method 都會取得同一個 middleware instance