Ray Lee | 李宗叡
Learn or Die
Published in
10 min readDec 2, 2020

--

Photo by Wilhelm Gunkel on Unsplash

# 前言

我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。

# 版本

Laravel 7.x

# 目錄

Laravel — 官方文件原子化翻譯 — 目錄

# 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

--

--

Ray Lee | 李宗叡
Learn or Die

It's Ray. I do both backend and frontend, but more focus on backend. I like coding, and would like to see the whole picture of a product.