所有的路由和控制器處理完業務邏輯之后都會返回一個發送到用戶瀏覽器的響應,Laravel 提供了多種不同的方式來返回響應,最基本的響應就是從路由或控制器返回一個簡單的字符串,框架會自動將這個字符串轉化為一個完整的 HTTP 響應。
Route::get( / , function () { return Hello World });
除了從路由或控制器返回字符串之外,還可以返回數組。框架會自動將數組轉化為一個 JSON 響應。
Route::get( / , function () { return [1, 2, 3];});
注:還可以從路由或控制器返回 Eloquent 集合,這也會被自動轉化為 JSON 響應。
Response 對象通常,我們并不只是從路由簡單返回字符串或數組,大多數情況下,都會返回一個完整的 Illuminate/Http/Response 實例或視圖。
返回一個完整的 Response 實例允許你自定義響應的 HTTP 狀態碼和頭信息。Response 實例繼承自 Symfony/Component/HttpFoundation/Response 基類,該類提供了一系列方法用于創建 HTTP 響應。
Route::get( / , function () { return response( Hello World , 200) - header( Content-Type , text/plain });添加響應頭
大部分響應方法都可以以方法鏈的形式調用,從而可以流式構建響應(流接口模式)。例如,在發送響應給用戶前可以使用 header 方法來添加一系列響應頭。
return response($content) - header( Content-Type , $type) - header( X-Header-One , Header Value ) - header( X-Header-Two , Header Value
或者你可以使用 withHeaders 方法來指定頭信息數組添加到響應。
return response($content) - withHeaders([ Content-Type = $type, X-Header-One = Header Value , X-Header-Two = Header Value , ]);添加 html' target='_blank'>Cookie 到響應
使用響應實例上的 cookie 方法可以輕松添加 Cookie 到響應。例如,你可以使用 cookie 方法生成 Cookie 并將其添加到響應實例。
return response($content) - header( Content-Type , $type) - cookie( name , value , $minutes);
cookie 方法還可以接收更多使用頻率較低的額外可選參數,一般來說,這些參數和 PHP 原生提供的 setcookie 方法目的和意義差不多。
- cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)
此外,還可以使用 Cookie 門面以”隊列”形式將 Cookie 添加到響應。queue 方法接收 Cookie 實例或創建 Cookie 所必要的參數作為參數,這些 Cookie 會在響應被發送到瀏覽器之前添加到響應。
Route::get( cookie/response , function() { Cookie::queue(Cookie::make( site , www.baidu.com ,1)); Cookie::queue( author , admin , 1); return response( Hello Laravel , 200) - header( Content-Type , text/plain });
在瀏覽器中訪問 http://www.adm.devp/cookie/response ,就可以看到這兩個新增的 cookie 。
Cookie 加密默認情況下,Laravel 框架生成的 Cookie 都經過了加密和簽名,以免在客戶端被篡改。如果你想要讓特定的 Cookie 子集在生成時取消加密,可以通過 app/Http/Middleware 目錄下的中間件 App/Http/Middleware/EncryptCookies 提供的 $except 屬性來排除這些 Cookie。
/** * 不需要被加密的cookies名稱 * @var arrayprotected $except = [ cookie_name ,];重定向
重定向響應是 Illuminate/Http/RedirectResponse 類的實例,包含了必要的頭信息將用戶重定向到另一個 URL,有很多方式來生成 RedirectResponse 實例,最簡單的方法就是使用全局輔助函數 redirect。
Route::get( dashboard , function () { return redirect( home/dashboard });
有時候你想要將用戶重定向到上一個請求的位置,比如,表單提交后,驗證不通過,你就可以使用輔助函數 back 返回到前一個 URL(由于該功能使用了 Session,使用該方法之前確保相關路由位于 web 中間件組或者應用了 Session 中間件)。
Route::post( user/profile , function () { // 驗證請求... return back()- withInput();});重定向到命名路由
如果調用不帶參數的 redirect 方法,會返回一個 Illuminate/Routing/Redirector 實例,然后就可以使用 Redirector 實例上的所有方法。
例如,要生成一個 RedirectResponse 到命名路由,可以使用 route 方法。
return redirect()- route( login
如果路由中有參數,可以將其作為第二個參數傳遞到 route 方法:
// For a route with the following URI: profile/{id}return redirect()- route( profile , [ id =通過 Eloquent 模型填充路由參數
如果要重定向到帶 ID 參數的路由( Eloquent 模型綁定 ),可以傳遞模型本身,ID 會被自動解析出來。
return redirect()- route( profile , [$user]);
如果你想要自定義這個路由參數中的默認參數名(默認是 id),需要重寫模型實例上的 getRouteKey 方法。
/** * Get the value of the model s route key. * @return mixedpublic function getRouteKey() return $this- slug;}重定向到控制器方法
你還可以生成重定向到控制器的方法,只需傳遞控制器和方法名到 action 方法即可。記住,你不需要指定控制器的完整命名空間,因為 Laravel 的 RouteServiceProvider 將會自動設置默認的控制器命名空間。
return redirect()- action( HomeController@index
和 route 方法一樣,如果控制器路由要求參數,你可以將參數作為第二個參數傳遞給 action 方法。
return redirect()- action( UserController@profile , [ id =帶一次性 Session 數據的重定向
重定向到一個新的 URL 并將數據存儲到一次性 Session 中通常是同時完成的,為了方便,可以創建一個 RedirectResponse 實例然后在同一個方法鏈上將數據存儲到 Session,這種方式在 action 之后存儲狀態信息時特別方便。
Route::post( user/profile , function () { // 更新用戶屬性... return redirect( dashboard )- with( status , Profile updated! });
用戶重定向到新頁面之后,你可以從 Session 中取出并顯示這些一次性信息,使用 Blade 語法實現如下:
@if (session( status )) p >注:這個一次性體現在第一次從 Session 取出數據之后,這些數據就會被銷毀,不復存在。
其它響應類型上面我們講了 Response 和 RedirectResponse 兩種響應類型,我們還可以通過輔助函數 response 很方便地生成其他類型的響應實例,當無參數調用 response 時會返回 Illuminate/Contracts/Routing/ResponseFactory 契約的一個實現,該契約提供了一些有用的方法來生成各種響應,如視圖響應、JSON 響應、文件下載、流響應等等。
視圖響應如果你需要控制響應狀態和響應頭,并且還需要返回一個視圖作為響應內容,可以使用 view 方法。
return response() - view( hello , $data, 200) - header( Content-Type , $type);當然,如果你不需要傳遞自定義的 HTTP 狀態碼和頭信息,只需要簡單使用全局輔助函數 view 即可。
Route::get( view/response , function() { return view( hello });注:視圖響應的視圖文件必須存在,視圖文件位于 resources/views 目錄中。
JSON響應json 方法會自動將 Content-Type 頭設置為 application/json,并使用 PHP 函數 json_encode 方法將給定數組轉化為 JSON 格式的數據。
return response()- json([ name = Abigail , state = CA ]);如果你想要創建一個 JSONP 響應,可以在 json 方法之后調用 withCallback 方法。
return response() - json([ name = Abigail , state = CA ]) - withCallback($request- input( callback或者直接使用 jsonp 方法。
return response() - jsonp($request- input( callback ), [ name = Abigail , state = CA文件下載download 方法用于生成強制用戶瀏覽器下載給定路徑文件的響應。download 方法接受文件名作為第二個參數,該參數決定用戶下載文件的顯示名稱,你還可以將 HTTP 頭信息作為第三個參數傳遞到該方法。
return response()- download($pathToFile);return response()- download($pathToFile, $name, $headers);return response()- download($pathToFile)- deleteFileAfterSend(true);注:管理文件下載的 Symfony HttpFoundation 類要求被下載文件有一個 ASCII 文件名,這意味著被下載文件名不能是中文。
Route::get( download/response , function() { return response()- download(storage_path( app/photo/test.jpg ), 測試圖片.jpg });文件響應file 方法可用于直接在用戶瀏覽器顯示文件,例如圖片或 PDF,而不需要下載,該方法接收文件路徑作為第一個參數,頭信息數組作為第二個參數。
return response()- file($pathToFile);return response()- file($pathToFile, $headers);響應宏如果你想要定義一個自定義的可以在多個路由和控制器中復用的響應,可以使用 Response 門面上的 macro 方法。
例如,在某個服務提供者的 boot 方法中編寫代碼如下:
?phpnamespace App/Providers;use Illuminate/Support/Facades/Response;use Illuminate/Support/ServiceProvider;class ResponseMacroServiceProvider extends ServiceProvider * Perform post-registration booting of services. * @return void public function boot() Response::macro( caps , function ($value) { return Response::make(strtoupper($value));}macro 方法接收響應名稱作為第一個參數,閉包函數作為第二個參數,響應宏的閉包在 ResponseFactory 實現類或輔助函數 response 中調用宏名稱的時候被執行。
Route::get( macro/response , function() { return response()- caps( test });在瀏覽器中訪問 http://www.adm.devp/macro/response ,輸出入下:
TEST相關推薦:
如何實現Laravel 5.5可響應接口
Laravel5.2博客實戰視頻教程
以上就是Laravel 5.5如何創建響應?創建響應的介紹(代碼)的詳細內容,PHP教程
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答