Ray Lee | 李宗叡
Learn or Die
Published in
7 min readDec 9, 2020

--

Photo by Markus Spiske on Unsplash

# 前言

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

# 版本

Laravel 8.x

# 目錄

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

# Accessing The Request

以下的 Laravel example code 的意思是?

  • Example:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
public function store(Request $request)
{
$name = $request->input('name');

//
}
}
  • Answer: 使用 dependency injection 取得當前 HTTP request

# Dependency Injection & Route Parameters

以下的 Laravel example code 的意思是?

  • Example:
<?php
// 位於 .../Routes/web.php
Route::put('user/{id}', 'UserController@update');

// 位於 controller
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
public function update(Request $request, $id)
{
//
}
}
  • Answer: 從 route url parameter 取得 $id, 並 inject 到 update method 當中

# Accessing The Request Via Route Closures

以下的 Laravel example code 的意思是?

  • Example:
<?php
use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
//
});
  • Answer: 在 route closure 內 inject 當前 HTTP request, 然後可在 closure 內存取

# Requests Path & Method

# Retrieving The Request Path

Laravel 中, 假設我的 request URL 是 http://domain.com/foo/bar, 以下的 example code 會取得什麼樣的輸出?

  • Example:
<?php
$uri = $request->path();
  • Answer: foo/bar

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->is('admin/*')) {
//
}
  • Answer: 驗證 request path 是否為 admin 開頭

# Retrieving The Request URL

以下的 Laravel example code 的意思是?

  • Example:
<?php
$url = $request->fullurl();

以下的 Laravel example code 的意思是?

  • Example:
<?php
$url = $request->url();

// URL 為 http://domain.com/foo/bar?appearance=handsome&personality=humourous

# Retrieving The Request Method

以下的 Laravel example code 的意思是?

  • Example:
<?php
$method = $request->method();
  • Answer: 取得當前 Request 的 HTTP method

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->isMethod('post')) {
//
}
  • Answer: 判斷當前 Request 的 HTTP method 是否為 POST

# PSR-7 Requests

Laravel 中, 如果我想要取得 PSR-7 request, 而不是 Laravel request, 我需要安裝哪兩個套件?

composer require symfony/psr-http-message-bridge
composer require nyholm/psr7

以下的 Laravel example code 的意思是?

  • Example:
<?php
use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
//
});
  • Answer: 取得 PSR-7 Request, 需先安裝必要套件

Laravel 中, 當我 return 一個 PSR7 request, Laravel 默認會把它轉成什麼?

Laravel response instance

# Input Trimming & Normalization

以下位於 …/Http/Kernel 的 Laravel example code 的意思是?

  • Example:
<?php
protected $middleware = [
// \App\Http\Middleware\TrimStrings::class,
// \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
  • Answer: TrimStrings 會將 string input 的前後空白 trim 掉, 而 ConvertEmptyStringsToNull 會將 empty string 轉成 null, 如果不想這些效果, 可在 Http/Kernel 內的 $middleware property 將這兩個 middleware comment 掉

# Retrieving Input

# Retrieving All Input Data

以下的 Laravel example code 的意思是?

  • Example:
<?php
$input = $request->all()
  • Answer: 取得當前 Request 的所有 input data, 型別為 array

# Retrieving An Input Value

以下的 Laravel example code 的意思是?

  • Example:
<?php
$name = $request->input('name');
  • Answer: 取得當前 Request 當中, input 為 ‘name’ 的值

以下的 Laravel example code 的意思是?

  • Example:
<?php
$name = $request->input('name', 'Sally');
  • Answer: 取得 input ‘name’ 的值, 若 ‘name’ 不存在, 則回傳值 ‘Sally’

以下的 Laravel example code 的意思是?

  • Example:
<?php
$name = $request->input('products.*.name');
  • Answer: products 會是一個 array, 底下有多個 index, 每個 index 都會有 name input, 這會取得所有 index 的 name input

以下的 Laravel example code 的意思是?

  • Example:
<?php
$input = $request->input()
  • Answer: 取得 request 的所有 input

# Retrieving Input From The Query String

以下的 Laravel example code 的意思是?

  • Example:
<?php
$name = $request->query('name', 'Helen');
  • Answer: 從 request 的 query 中取得 name input, 若 name 不存在, 則回傳 ‘Helen’

以下的 Laravel example code 的意思是?

  • Example:
<?php
$name = $request->query();
  • Answer: 從當前 request 中取得所有的 query key/value

# Retrieving Input Via Dynamic Properties

Laravel 中, 當我使用 Request 的 Dynamic Properties 時, Laravel 會先找 request payload 還是 route parameters?

request payload

Laravel 中, $request->name 以及 $request->input(‘name’) 的差異?

  • $request->name 會先尋找 request payload, 再尋找 route parameter 的 field
  • $request->input(‘name’) 只會從 request payload 中尋找

# Retrieving JSON Input Values

以下的 Laravel example code 的意思是?

  • Example:
<?php
$name = $request->input('user.name');
  • Answer: 如果說 content type 是 JSON, 從 user object 取得 key 為 name 的 value

# Retrieving Boolean Input Values

以下的 Laravel example code 的意思是?

  • Example:
<?php
$archived = $request->boolean('archived');
  • Answer: 假設 archived file 的 value 為 0 / 1, 會自動轉為 boolean

Laravel 中, Request 的 boolean method 會將哪些值轉化成 true?

  • 1
  • “1”
  • true
  • “true”
  • “on”
  • “yes”

# Retrieving A Portion Of The Input Data

以下的 Laravel example code 的意思是?

  • Example:
<?php
$input = $request->only(['username', 'password']);
  • Answer: 只取得 username 以及 password input

以下的 Laravel example code 的意思是?

  • Example:
<?php
$input = $request->except('credit_card');
  • Answer: 取得 ‘create_card’ 之外的所有 input

# Determining If An Input Value Is Present

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->has('name')) {
//
}
  • Answer: 判斷 request 中是否有 ‘name’ 這個 input, 有沒有 value 則不管

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->has(['name', 'email'])) {
//
}
  • Answer: 判斷 request 中是否 ‘name’ 跟 ‘email’ input 有 present

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->hasAny(['name', 'email'])) {
//
}
  • Answer: 判斷 Request 中是否有 'name''email' input present

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->filled('name') {
//
}
  • Answer: 判斷 request 中, 'name' key 是否存在, 且值是否不為 empty, filled() 回傳 boolean

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->missing('name') {
//
}
  • Answer: 如果 $request 中沒有 ‘name’ 這個 input key, 返回 true

# Old Input

# Flashing Input To The Session

以下的 Laravel example code 的意思是?

  • Example:
<?php
$request->flashOnly(['username', 'email']);
  • Answer: 只將 $request 中的 input username, 以及 email 存到 session 當中

以下的 Laravel example code 的意思是?

  • Example:
<?php
$request->flash();
  • Answer: 將 Request 載入到 session 當中

以下的 Laravel example code 的意思是?

  • Example:
<?php
$request->flashExcept('password');
  • Answer: 將 $request 中, 除了 password 之外的 attributes 都存到 session

# Flashing Input Then Redirecting

以下的 Laravel example code 的意思是?

  • Example:
<?php
return redirect('form')->withInput(
$request->except('password')
);
  • Answer: 導向 'form' web route, 並將 Request 中除了 'password' 之外的 data 都存到 session, 並帶過去

# Retrieving Old Input

以下的 Laravel example code 的意思是?

  • Example:
<?php
$username = $request->old('username');
  • Answer: 從 session 中取得上一次 request 的資料

以下的 Laravel example code 的意思是?

  • Example
<input type="text" name="username" value="{{ old('username') }}">
  • Answer: 從 old global helper 中取得 session 中上一次 request 的 username

Laravel 中, 當我使用 global helper old 來取得 session 中的 request 資料時, 如果該資料不存在, old helper 會 return 什麼?

null

# Cookies

# Retrieving Cookie From Requests

由 Laravel 建立的 cookies 都會被經過怎麼樣的處理以確保安全性?

加密以及簽名

以下的 Laravel example code 的意思是?

  • Example:
<?php
$value = $request->cookie('name');
  • Answer: 從 request 中取得 cookie 中的 'name' field

以下的 Laravel example code 的意思是?

  • Example:
<?php
use Illuminate\Support\Facades\Cookie;

$value = Cookie::get('name');
  • Answer: 取得 cookie 中的 name field

# Attaching Cookies To Responses

以下的 Laravel example code 的意思是?

  • Example:
<?php
return response('Hello World')->cookie(
'name', 'value', $minutes
);
  • Answer: 定義 response 中的 cookie 的 name, value, 以及有效時間

以下的 Laravel 程式碼的意思是?

  • Example:
<?php
return response('Hello World')->cookie(
'name', 'value', $minutes, $path, $domain, $secure, $httpOnly
);

以下的 Laravel 程式碼的意思是?

  • Example:
<?php
Cookie::queue(Cookie::make('name', 'value', $minutes));

Cookie::queue('name', 'value', $minutes);
  • Answer: 定義 cookie, 該 cookie 會隨著當次的 response 送出

Laravel 若要定義 cookie, 除了使用 Response instance 的 cookie method 之外, 還可以使用 哪一個 class哪一個 method?

  • Cookie class
  • queue method

以下的 Laravel example code 的意思是?

  • Example:
<?php
Cookie::queue('name', 'value', $minutes);
  • Answer: 定義 cookie 的 name, value 以及有效期限, 該 cookie 會隨著當次的 response 送出

# Generating Cookie Instances

以下的 Laravel example code 的意思是?

  • Example:
<?php
$cookie = cookie('name', 'value', $minutes);

return response('Hello World')->cookie($cookie);
  • Answer: 定義 cookie 內容, 並將之 attach 到該 response

# Files

# Retrieving Uploaded Files

Laravel 中, Request class 的 file method 會 return 哪一個 instance??

Illuminate\Http\UploadedFile

以下的 Laravel example code 的意思是?

  • Example:
<?php
$file = $request->file('photo');

$file = $request->photo;
  • Answer: 從 request 取得名為 photo 的 file, 兩種方式皆可

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->hasFile('photo')) {
//
}
  • Answer: 判斷 request 是否有 attribute name 為 'photo' 的 file

# Validating Successful Uploads

以下的 Laravel example code 的意思是?

  • Example:
<?php
if ($request->file('photo')->isValid()) {
//
}
  • Answer: 判斷 file photo 是否有上傳成功

# File Paths & Extensions

以下的 Laravel example code 的意思是?

  • Example
<?php
$path = $request->photo->path();
  • Answer: 取得 photo file 儲存的 path

以下的 Laravel example code 的意思是?

  • Example
<?php
$extention = $request->photo->extension();
  • Answer: 從 $request 中取得 file photo 的 extension

# Other File Method

Laravel 中, 更多 UploadedFile class 的 method 可以參考哪裏?

API documentation for the class

# Storing Uploaded Files

以下的 Laravel example 是什麼意思?

  • Example:
<?php
$path = $request->photo->store('images');
  • Answer: 將 photo 這個 uploaded file 存到 env 檔設定的 storage 的路徑 images, 檔名自動產生

以下的 Laravel example code 的意思是?

  • Example:
<?php
$path = $request->photo->store('images', 's3');
  • Answer: 將 photo 這個 uploaded file 存到的 s3 storage, 路徑 images, 檔名自動產生

以下的 Laravel example code 的意思是?

  • Example:
<?php
$path = $request->photo->storeAs('images', 'filename.jpg', 's3');
  • Answer: 儲存一個 uploaded file 到 storage, storage 特別指定是 s3, storage 內的路徑為 images, 檔名特別指定為 filename.jpg

# Configuration Trusted Proxies

Laravel 中, 當我們把應用運行在 LB 後面, 這時可能無法正確的產生 HTTPS 連結, 這時哪一個 middleware 可以解決這個問題?

TrustProxies

以下的 Laravel example code 的意思是?

  • Example:
<?php

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
protected $proxies = [
'192.168.1.1',
'192.168.1.2',
];

protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
  • Answer:
<?php

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
// 加入信任的 proxies ip, 這樣才可以正確的產生 HTTPS 連結
protected $proxies = [
'192.168.1.1',
'192.168.1.2',
];

// 在定義 ip 後, 可定義 $header 以進一步辨識 request 的來源
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

以下的 Laravel example code 的意思是?

  • Example:
<?php

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB
}
  • Answer: 當使用 AWS Elastic Load Balancing, 需定義以上 header

Laravel 中, 如果我有使用 LB, 但我不知道我 LB 的 IP, 所以我想要信任所有的 proxy, 那我可以怎麼做?

  • Example:
<?php

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
protected $proxies = '*';
}
  • Answer: 如果有使用 LB, 但不知道 LB 的 IP, 因而想要信任所有 proxy 的話, 可設為 '*'

--

--

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.