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

# 前言

學習一個框架, 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 的意思是?
以下的 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

由 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 送出
  • Cookie class
  • queue method
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Cookie::queue('name', 'value', $minutes);
  • Answer:
    定義 cookie 的 name, value 以及有效期限, 該 cookie 會隨著當次的 response 送出

以下的 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’, 則使用該值, 若該值不存在, 則使用第二個自己指定的值
kubernetes - Secrets <未完成> kubernetes - Storage Classes

留言

Your browser is out-of-date!

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

×