HTTP 響應(yīng)

2018-12-17 10:42 更新

基本響應(yīng)

從路由返回字串

最基本的響應(yīng)就是從 Laravel 的路由返回字串:

Route::get('/', function(){
    return 'Hello World';});

           

建立自定義響應(yīng)

但是以大部分的路由及控制器所執(zhí)行的動作來說,你需要返回完整的 Illuminate\Http\Response 實例或是一個視圖。返回一個完整的 Response 實例時,你能夠自定義響應(yīng)的 HTTP 狀態(tài)碼以及響應(yīng)頭。Response 實例繼承了 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 文檔.

在響應(yīng)送出視圖

如果想要使用 Response 類的方法,但最終返回視圖給用戶,你可以使用簡便的 view 方法:

return response()->view('hello')->header('Content-Type', $type);

           

附加 Cookies 到響應(yīng)

return response($content)->withCookie(cookie('name', 'value'));

           

鏈式方法

切記,大多數(shù)的 Response 方法都是可以鏈式調(diào)用的,用以建立流暢的響應(yīng):

return response()->view('hello')->header('Content-Type', $type)
                 ->withCookie(cookie('name', 'value'));

           

           

重定向

重定向響應(yīng)通常是類 Illuminate\Http\RedirectResponse 的實例,并且包含用戶要重定向至另一個 URL 所需的響應(yīng)頭。

返回重定向

有幾種方法可以產(chǎn)生 RedirectResponse 的實例,最簡單的方式就是透過輔助方法 redirect。當在測試時,建立一個模擬重定向響應(yīng)的測試并不常見,所以使用輔助方法通常是可行的:

return redirect('user/login');

           

返回重定向并且加上快閃數(shù)據(jù)( Flash Data )

通常重定向至新的 URL 時會一并將數(shù)據(jù)存進一次性 Session。所以為了方便,你可以利用方法連接的方式創(chuàng)建一個 RedirectResponse 的實例將數(shù)據(jù)存進一次性 Session:

return redirect('user/login')->with('message', 'Login Failed');

           

返回根據(jù)前一個 URL 的重定向

你可能希望將用戶重定向至前一個位置,例如當表單提交之后。你可以使用 back 方法來達成這個目的:

return redirect()->back();return redirect()->back()->withInput();

           

返回根據(jù)路由名稱的重定向

當你調(diào)用輔助方法 redirect 且不帶任何參數(shù)時,將會返回 Illuminate\Routing\Redirector 的實例,你可以對該實例調(diào)用任何的方法。舉個例子,要產(chǎn)生一個 RedirectResponse 到一個路由名稱,你可以使用 route 方法:

return redirect()->route('login');

           

返回根據(jù)路由名稱的重定向,并給予路由參數(shù)賦值

如果你的路由有參數(shù),你可以放進 route 方法的第二個參數(shù)。

// 路由的 URI 為:profile/{id}return redirect()->route('profile', [1]);

           

如果你要重定向至路由且路由的參數(shù)為 Eloquent 模型的「ID」,你可以直接將模型傳入,ID 將會自動被提?。?/p>

return redirect()->route('profile', [$user]);

           

返回根據(jù)路由名稱的重定向,并給予特定名稱路由參數(shù)賦值

// 路由的 URI 為:profile/{user}return redirect()->route('profile', ['user' => 1]);

           

返回根據(jù)控制器動作的重定向

既然可以產(chǎn)生 RedirectResponse 的實例并重定向至路由名稱,同樣的也可以重定向至控制器動作

return redirect()->action('App\Http\Controllers\HomeController@index');

           

提示: 如果你已經(jīng)通過 URL::setRootControllerNamespace 注冊了根控制器的命名空間,那么就不需要對 action() 方法內(nèi)的控制器指定完整的命名空間。

返回根據(jù)控制器動作的重定向,并給予參數(shù)賦值

return redirect()->action('App\Http\Controllers\UserController@profile', [1]);

           

返回根據(jù)控制器動作的重定向,并給予特定名稱參數(shù)賦值

return redirect()->action('App\Http\Controllers\UserController@profile', ['user' => 1]);

           

           

其他響應(yīng)

使用輔助方法 response 可以輕松的產(chǎn)生其他類型的響應(yīng)實例。當你調(diào)用輔助方法 response 且不帶任何參數(shù)時,將會返回 Illuminate\Contracts\Routing\ResponseFactory Contract 的實做。Contract 提供了一些有用的方法來產(chǎn)生響應(yīng)。

建立 JSON 響應(yīng)

json 方法會自動將響應(yīng)頭的 Content-Type 配置為 application/json

return response()->json(['name' => 'Abigail', 'state' => 'CA']);

           

建立 JSONP 響應(yīng)

return response()->json(['name' => 'Abigail', 'state' => 'CA'])
                 ->setCallback($request->input('callback'));

           

建立文件下載的響應(yīng)

return response()->download($pathToFile);return response()->download($pathToFile, $name, $headers);return response()->download($pathToFile)->deleteFileAfterSend(true);

           

**提醒:**管理文件下載的擴展包,Symfony HttpFoundation,要求下載文件名必須為 ASCII。

           

響應(yīng)宏

如果你想要自定義可以在很多路由和控制器重復使用的響應(yīng),你可以使用 Illuminate\Contracts\Routing\ResponseFactory 實做的方法 macro。

舉個例子,來自服務(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ù)第一個參數(shù)為宏名稱,第二個參數(shù)為閉包函數(shù)。閉包函數(shù)會在 ResponseFactory的實做或者輔助方法 response 調(diào)用宏名稱的時候被執(zhí)行:

return response()->caps('foo');


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號