# 前言
我喜歡使用 Laravel 開發的感覺, 除了開發快速, 程式碼簡潔且優雅之外, Laravel 框架本身也是一個很好的學習參照物。 本篇主要將官方文件重點整理成 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
# 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 轉大寫