# 前言
我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。
# 版本
# 目錄
# 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();
- Answer: 取得全部的 Request URL 例如 http://domain.com/foo/bar?appearance=handsome&personality=humourous 全部
以下的 Laravel example code 的意思是?
- Example:
<?php
$url = $request->url();
// URL 為 http://domain.com/foo/bar?appearance=handsome&personality=humourous
- Answer: 取得除了 query string 之前的 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
);
- Answer: 設定 cookie, 參數細節可參考 PHP Document
以下的 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 的話, 可設為
'*'