# 前言
學習一個框架, 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
# 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 轉大寫
留言