Ray Lee | 李宗叡
Learn or Die
Published in
15 min readDec 9, 2020

--

Photo by CDC on Unsplash

# 前言

我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 Q&A 的形式呈現, 原子化的概念, 這方式並不適用於每個人, 但若對你有幫助, 我會很開心。

# 版本

Laravel 6.x

# 目錄

Laravel — 官方文件原子化翻譯 — 目錄

# 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 轉大寫

--

--

Ray Lee | 李宗叡
Learn or Die

It's Ray. I do both backend and frontend, but more focus on backend. I like coding, and would like to see the whole picture of a product.