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

# 前言

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。



# Creating Responses

# Strings & Arrays

以下的 Laravel example code 的意思是?
  • Example
    <?php
    Route::get('/', function () {
    return 'Hello World';
    });
  • Answer:
    當收到 'example.com/' 的 GET request 時, return string 'Hello World'
以下的 Laravel 範例回以什麼格式 return?
  • Example:
    <?php
    Route::get('/', function () {
    return [1, 2, 3];
    });
  • Answer:
    JSON
Laravel 中, 如果我 return 一個 Eloquent collection, 最終會以什麼格式 return?

JSON


# Response Objects

以下的 Laravel example 的意思是?
  • Example:
    <?php
    Route::get('home', function () {
    return response('Hello World', 200)
    ->header('Content-Type', 'text/plain');
    });
  • Answer:
    <?php
    Route::get('home', function () {
    // return stirng 'Hello World', status code 為 200
    return response('Hello World', 200)
    // header Content-type 為 text/plain
    ->header('Content-Type', 'text/plain');
    });

# Attaching Headers To Responses

Laravel 中, attach header 有哪兩種方式?
  • chain header method
  • withHeaders method
解釋以下的 Laravel 範例
  • Example:
    <?php
    return response($content)
    ->header('Content-Type', $type)
    ->header('X-Header-One', 'Header Value')
    ->header('X-Header-Two', 'Header Value');
  • Answer:
    利用 header chain 的方式 attach 多個 header
解釋以下的 Laravel 範例
  • Example:
    <?php
    return response($content)
    ->withHeaders([
    'Content-Type' => $type,
    'X-Header-One' => 'Header Value',
    'X-Header-Two' => 'Header Value',
    ]);
  • Answer:
    使用 withHeaders method 的方式 attach 一個 array

# Cache Control Middleware

Laravel 中, 如果我要快速地針對特定 route 設定 Cache-Control header, 那我可以使用哪個 middleware?

cache.headers middleware

解釋下面的 Laravel example
  • Example:
    <?php
    Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () {
    Route::get('privacy', function () {
    // ...
    });

    Route::get('terms', function () {
    // ...
    });
    });
  • Answer:
    <?php
    // 使用 cache.header middleware 來對特定 route 做 Cache-Controel, 語法可參考
    // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
    // etag 會針對 response 內容做一個 MD5 hash 以做為識別器

    Route::middleware('cache.headers:public;max_age=2628000;etag')->group(function () {
    Route::get('privacy', function () {
    // ...
    });

    Route::get('terms', function () {
    // ...
    });
    });

# Attaching Cookies To Responses

Requests Documentation


# Cookies & Encryption

以下位於 EncryptCookies middleware 的 Laravel example code 的意思是?
  • Example:
    <?php
    protected $except = [
    'cookie_name',
    ];
  • Answer:
    Laravel 預設會對 cookie encrypt 以及 sign, 所以他們無法被 client 修改或讀取, 如果要取消這個動作, 可以在 'EncryptCookies' middleware 中的 $except property 加入 cookie name


# Redirects

Laravel 中, redirect responses 是哪一個 class 的 instance?

Illuminate\Http\RedirectResponse

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::get('dashboard', function () {
    return redirect('home/dashboard');
    });
  • Answer:
    'dashboard' 的 GET request redirect 到 'home/dashboard' 這個 route
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::post('user/profile', function () {
    // Validate the request...

    return back()->withInput();
    });
  • Answer:
    redirect 回上一個位置, 帶著 input

# Redirecting To Named Routes

Laravel 中, 當我使用 redirect method without no parameters, 會 return 哪一個 class 的 instance?

Illuminate\Routing\Redirector

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return redirect()->route('login', ['id' => 1]);
  • Answer:
    redirect 到名為 'login' 的 route, 並帶著 parameter ['id' => 1]

# Populating Parameters Via Eloquent Models

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    // For a route with the following URI: profile/{id}

    return redirect()->route('profile', [$user]);
  • Answer:
    如果要導向的 route 有著 {id} url parameter, 可以直接 pass model 過去, id 會自動被取出

# Redirecting To Controller Actions

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return redirect()->action('HomeController@index');
  • Answer:
    redirect 到一個 controller 名為 HomeController@index
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return redirect()->action(
    'UserController@profile', ['id' => 1]
    );
  • Answer:
    帶著 parameter 並 redirect 到 UserController@profile

# Redirecting To External Domains

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return redirect()->away('https://www.google.com');
  • Answer:
    redirect 到一個非 route 範圍內的 url

# Redirecting With Flashed Session Data

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::post('user/profile', function () {
    // Update the user's profile...

    return redirect('dashboard')->with('status', 'Profile updated!');
    });
  • Answer:
    處理完 POST request 後, redirect 到 'dashboard' route, 並將 message 存到 session 帶過去
以下的 Laravel example code 的意思是?
  • Example code:
    <?php
    Route::post('user/profile', function () {
    // Update the user's profile...

    return redirect('dashboard')->with('status', 'Profile updated!');
    });
  • Example blade:
    <?php
    @if (session('status'))
    <div class="alert alert-success">
    {{ session('status') }}
    </div>
    @endif
  • Answer:
    redirect 到 dashboard route, 將 status 存到 session 並帶過去, 在 blade page 中拿出 session


# Other Responses Types

Laravel 中, 當 response helper 被呼叫並且不帶任何參數時, 會回傳哪一個 class?

Illuminate\Contracts\Routing\ResponseFactory

# View Responses

解釋以下 Laravel example
  • Example:
    <?php
    return response()
    ->view('hello', $data, 200)
    ->header('Content-Type', $type);
  • Answer:
    <?php
    // 使用 response global helper
    return response()
    // return view, customized status code
    ->view('hello', $data, 200)
    // return header
    ->header('Content-Type', $type);

# JSON Responses

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $array = ['name' => 'Abigail', 'state' => 'CA'];
    return response()->json($array);
  • Answer:
    將 $array 變成 json 並回傳
解釋以下 Laravel example
  • Example:
    <?php
    return response()
    ->json(['name' => 'Abigail', 'state' => 'CA'])
    ->withCallback($request->input('callback'));
  • Answer:
    建立一個 JSONP response

# File Downloads

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return response()->download($pathToFile);
  • Answer:
    直接觸發瀏覽器下載這個檔案
解釋以下的 Laravel example
  • Example:
    <?php
    return response()->download($pathToFile, $name, $headers);
  • Answer:
    讓瀏覽器下載檔案, 指定使用者方看到的檔案名稱, 並且指定 header
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return response()->download($pathToFile)->deleteFileAfterSend();
  • Answer:
    觸發瀏覽器下載一個檔案, 下載完畢後, server 端刪除此檔案

# Streamed Downloads

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return response()->streamDownload(function () {
    echo GitHub::api('repo')
    ->contents()
    ->readme('laravel', 'laravel')['contents'];
    }, 'laravel-readme.md');
  • Answer:
    觸發使用者瀏覽器直接下載檔案, 但分批讀取檔案, 避免檔案的讀取將記憶體吃光

# File Responses

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    return response()->file($pathToFile);
  • Answer:
    觸發瀏覽器開啟一個檔案, 而不是下載


# Response Macros

Laravel 中, 如果我想要自己建一個 service provider, 那我可以建立在哪一個資料夾中?

app/Providers

解釋以下 Laravel example
  • Example:
    <?php

    namespace App\Providers;

    use Illuminate\Support\Facades\Response;
    use Illuminate\Support\ServiceProvider;

    class ResponseMacroServiceProvider extends ServiceProvider
    {
    public function boot()
    {
    Response::macro('caps', function ($value) {
    return Response::make(strtoupper($value));
    });
    }
    }
  • Answer:
    <?php

    // 在 App/Providers 資料夾下, 建立一個檔案, 並指定好 namespace
    namespace App\Providers;

    // 會用到 Facades\Response
    use Illuminate\Support\Facades\Response;
    use Illuminate\Support\ServiceProvider;

    // 自定義的 class 需 extends 內建 ServiceProvider
    class ResponseMacroServiceProvider extends ServiceProvider
    {
    // 在 boot method 中
    public function boot()
    {
    // 使用 macro method 來定義名為 caps 的 response
    Response::macro('caps', function ($value) {
    // 該 response 的邏輯
    return Response::make(strtoupper($value));
    });
    }
    }
以下的 Laravel example code 的意思是?
  • Example:
    <?php

    namespace App\Providers;

    use Illuminate\Support\Facades\Response;
    use Illuminate\Support\ServiceProvider;

    class ResponseMacroServiceProvider extends ServiceProvider
    {
    public function boot()
    {
    Response::macro('caps', function ($value) {
    return Response::make(strtoupper($value));
    });
    }
    }

    return response()->caps('foo');
  • Answer:
    使用自定義的 ‘caps’ response, 將 response 的 value 轉大寫
Laravel - The Basics - URL Generation (官方文件原子化翻譯筆記) Laravel - The Basics - Views (官方文件原子化翻譯筆記)

留言

Your browser is out-of-date!

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

×