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 中, 如果我要取得 uploaded file 的 path, 假設該 uploaded file 的 attribute name 為 photo, 在以下的 Example 中, 我可以怎麼做?
  • Example

    <?php
    $path = $request->what should I put here?
  • Answer:

    <?php
    $path = $request->photo->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 中, 如果我要儲存一個 uploaded file, 我可以使用 哪一個 class哪一個 method?
  • UploadedFile class
  • store method
以下的 Laravel example 是什麼意思?
  • Example:

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

以下的 Laravel example 中, images 是什麼意思?
  • Example:

    <?php
    $path = $request->photo->store('images');
  • Answer:
    path

以下的 Laravel example 中, 檔名是什麼??
  • Example:

    <?php
    $path = $request->photo->store('images');
  • Answer:
    自動產生的

以下的 Laravel example 中, s3 是什麼
  • Example:

    <?php
    $path = $request->photo->store('images', 's3');
  • Answer:
    特別指定儲存的 storage, 預設的可能是其他的

以下的 Laravel example 中, 如果我要儲存一個 uploaded file 到預設的 storage, storage 內的路徑為 images, 檔名自動生成, 我可以怎麼做?
  • Example:

    <?php
    $path = $request->photo->what should I put here?
  • Answer:

    <?php
    $path = $request->photo->store('images');
以下的 Laravel example 中, 如果我要儲存一個 uploaded file 到 storage, storage 我要特別指定是 s3, storage 內的路徑為 images, 檔名自動生成, 我可以怎麼做?
  • Example:

    <?php
    $path = $request->photo->what should I put here?
  • Answer:

    <?php
    $path = $request->photo->store('images', 's3');
以下的 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 中, 當我們把應用運行在 LB 後面, 這時可能無法正確的產生 HTTPS 連結, 這時我可以在下面的 Example 中的什麼地方加入 ip?
  • Example:

    <?php

    namespace App\Http\Middleware;

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

    class TrustProxies extends Middleware
    {
    // What should I put here?
    }
  • Answer:

    <?php

    namespace App\Http\Middleware;

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

    class TrustProxies extends Middleware
    {
    /**
    * The trusted proxies for this application.
    *
    * @var string|array
    */
    protected $proxies = [
    '192.168.1.1',
    '192.168.1.2',
    ];

    /**
    * The headers that should be used to detect proxies.
    *
    * @var string
    */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
    }
Laravel 中, 當我在 TrustProxies 中定義 IP 後, 如果我要更進一步的定義 header 來辨識, 那我可以在下面的 Example 中的哪裡設定?
  • Example:

    <?php

    namespace App\Http\Middleware;

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

    class TrustProxies extends Middleware
    {
    /**
    * The trusted proxies for this application.
    *
    * @var string|array
    */
    protected $proxies = [
    '192.168.1.1',
    '192.168.1.2',
    ];

    // What should I put here?
  • Answer:

    <?php

    namespace App\Http\Middleware;

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

    class TrustProxies extends Middleware
    {
    /**
    * The trusted proxies for this application.
    *
    * @var string|array
    */
    protected $proxies = [
    '192.168.1.1',
    '192.168.1.2',
    ];

    /**
    * The headers that should be used to detect proxies.
    *
    * @var string
    */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
Laravel 中, 如果我使用的 LB 是 AWS Elastic Load Balancing, 當我在 TrustProxies 中定義 IP 後, 如果我要更進一步的定義 header 來辨識, 則 header 必須是?
  • Example:

    <?php

    namespace App\Http\Middleware;

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

    class TrustProxies extends Middleware
    {
    /**
    * The trusted proxies for this application.
    *
    * @var string|array
    */
    protected $proxies = [
    '192.168.1.1',
    '192.168.1.2',
    ];

    /**
    * The headers that should be used to detect proxies.
    *
    * @var string
    */
    protected $headers = What should I put here?
    }
  • Answer:

    <?php

    namespace App\Http\Middleware;

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

    class TrustProxies extends Middleware
    {
    /**
    * The trusted proxies for this application.
    *
    * @var string|array
    */
    protected $proxies = [
    '192.168.1.1',
    '192.168.1.2',
    ];

    /**
    * The headers that should be used to detect proxies.
    *
    * @var string
    */
    protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB
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
    {
    /**
    * The trusted proxies for this application.
    *
    * @var string|array
    */
    protected $proxies = what should I put here?

    /**
    * The headers that should be used to detect proxies.
    *
    * @var string
    */
    protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB;
    }
  • Answer:

    <?php

    namespace App\Http\Middleware;

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

    class TrustProxies extends Middleware
    {
    /**
    * The trusted proxies for this application.
    *
    * @var string|array
    */
    protected $proxies = '*';

    /**
    * The headers that should be used to detect proxies.
    *
    * @var string
    */
    protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB
kubernetes - Secrets <未完成> kubernetes - Storage Classes

留言

Your browser is out-of-date!

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

×