# 前言
學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法
; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣造一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 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
以下的 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
留言