# 前言
學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法
; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣造一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 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 |
以下的 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 的話, 可設為'*'
# Additional
以下的 Laravel example code 的意思是?
- Example:
<?php
$row = request('row', (new Deposit)->getPerPage()); - Answer:
若 $request 中有指定的值, 如 ‘row’, 則使用該值, 若該值不存在, 則使用第二個自己指定的值
留言