最基本的響應(yīng)就是從 Laravel 的路由返回字串:
Route::get('/', function(){ return 'Hello World';});
但是以大部分的路由及控制器所執(zhí)行的動(dòng)作來說,你需要返回完整的 Illuminate\Http\Response
實(shí)例或是一個(gè)視圖。返回一個(gè)完整的 Response
實(shí)例時(shí),你能夠自定義響應(yīng)的 HTTP 狀態(tài)碼以及響應(yīng)頭。Response
實(shí)例繼承了 Symfony\Component\HttpFoundation\Response
類,它提供了很多方法來建立 HTTP 響應(yīng)。
use Illuminate\Http\Response;return (new Response($content, $status)) ->header('Content-Type', $value);
為了方便起見,你可以使用輔助方法 response
:
return response($content, $status) ->header('Content-Type', $value);
提示: 有關(guān)
Response
方法的完整列表可以參照 API 文檔 以及 Symfony API 文檔.
如果想要使用 Response
類的方法,但最終返回視圖給用戶,你可以使用簡(jiǎn)便的 view
方法:
return response()->view('hello')->header('Content-Type', $type);
return response($content)->withCookie(cookie('name', 'value'));
切記,大多數(shù)的 Response
方法都是可以鏈?zhǔn)秸{(diào)用的,用以建立流暢的響應(yīng):
return response()->view('hello')->header('Content-Type', $type) ->withCookie(cookie('name', 'value'));
重定向響應(yīng)通常是類 Illuminate\Http\RedirectResponse
的實(shí)例,并且包含用戶要重定向至另一個(gè) URL 所需的響應(yīng)頭。
有幾種方法可以產(chǎn)生 RedirectResponse
的實(shí)例,最簡(jiǎn)單的方式就是透過輔助方法 redirect
。當(dāng)在測(cè)試時(shí),建立一個(gè)模擬重定向響應(yīng)的測(cè)試并不常見,所以使用輔助方法通常是可行的:
return redirect('user/login');
通常重定向至新的 URL 時(shí)會(huì)一并將數(shù)據(jù)存進(jìn)一次性 Session。所以為了方便,你可以利用方法連接的方式創(chuàng)建一個(gè) RedirectResponse
的實(shí)例并將數(shù)據(jù)存進(jìn)一次性 Session:
return redirect('user/login')->with('message', 'Login Failed');
你可能希望將用戶重定向至前一個(gè)位置,例如當(dāng)表單提交之后。你可以使用 back
方法來達(dá)成這個(gè)目的:
return redirect()->back();return redirect()->back()->withInput();
當(dāng)你調(diào)用輔助方法 redirect
且不帶任何參數(shù)時(shí),將會(huì)返回 Illuminate\Routing\Redirector
的實(shí)例,你可以對(duì)該實(shí)例調(diào)用任何的方法。舉個(gè)例子,要產(chǎn)生一個(gè) RedirectResponse
到一個(gè)路由名稱,你可以使用 route
方法:
return redirect()->route('login');
如果你的路由有參數(shù),你可以放進(jìn) route
方法的第二個(gè)參數(shù)。
// 路由的 URI 為:profile/{id}return redirect()->route('profile', [1]);
如果你要重定向至路由且路由的參數(shù)為 Eloquent 模型的「ID」,你可以直接將模型傳入,ID 將會(huì)自動(dòng)被提?。?/p>
return redirect()->route('profile', [$user]);
// 路由的 URI 為:profile/{user}return redirect()->route('profile', ['user' => 1]);
既然可以產(chǎn)生 RedirectResponse
的實(shí)例并重定向至路由名稱,同樣的也可以重定向至控制器動(dòng)作:
return redirect()->action('App\Http\Controllers\HomeController@index');
提示: 如果你已經(jīng)通過
URL::setRootControllerNamespace
注冊(cè)了根控制器的命名空間,那么就不需要對(duì)action()
方法內(nèi)的控制器指定完整的命名空間。
return redirect()->action('App\Http\Controllers\UserController@profile', [1]);
return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]);
使用輔助方法 response
可以輕松的產(chǎn)生其他類型的響應(yīng)實(shí)例。當(dāng)你調(diào)用輔助方法 response
且不帶任何參數(shù)時(shí),將會(huì)返回 Illuminate\Contracts\Routing\ResponseFactory
Contract 的實(shí)做。Contract 提供了一些有用的方法來產(chǎn)生響應(yīng)。
json
方法會(huì)自動(dòng)將響應(yīng)頭的 Content-Type
配置為 application/json
:
return response()->json(['name' => 'Abigail', 'state' => 'CA']);
return response()->json(['name' => 'Abigail', 'state' => 'CA']) ->setCallback($request->input('callback'));
return response()->download($pathToFile);return response()->download($pathToFile, $name, $headers);return response()->download($pathToFile)->deleteFileAfterSend(true);
**提醒:**管理文件下載的擴(kuò)展包,Symfony HttpFoundation,要求下載文件名必須為 ASCII。
如果你想要自定義可以在很多路由和控制器重復(fù)使用的響應(yīng),你可以使用 Illuminate\Contracts\Routing\ResponseFactory
實(shí)做的方法 macro
。
舉個(gè)例子,來自服務(wù)提供者的 boot
方法:
<?php namespace App\Providers;use 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) use ($response) { return $response->make(strtoupper($value)); }); }}
macro
函數(shù)第一個(gè)參數(shù)為宏名稱,第二個(gè)參數(shù)為閉包函數(shù)。閉包函數(shù)會(huì)在 ResponseFactory
的實(shí)做或者輔助方法 response
調(diào)用宏名稱的時(shí)候被執(zhí)行:
return response()->caps('foo');
更多建議: