Laravel - The Basics - Middleware (官方文件原子化翻譯)

# 前言

學習一個框架, 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
Laravel - The Basics - Validation (官方文件原子化翻譯筆記) 使用 GCP Kubernetes Engine 來管理部署

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×