鍍金池/ 教程/ PHP/ HTTP 響應(yīng)
Laravel Cashier
Eloquent ORM
HTTP 響應(yīng)
發(fā)行說(shuō)明
擴(kuò)展包開(kāi)發(fā)
HTTP 控制器
事件
擴(kuò)展框架
Contracts
開(kāi)發(fā)
配置
表單驗(yàn)證
錯(cuò)誤與日志
Hashing
貢獻(xiàn)指南
郵件
Session
遷移與數(shù)據(jù)填充
查詢構(gòu)造器
Redis
升級(jí)向?qū)?/span>
概覽
緩存
服務(wù)提供者
Envoy 任務(wù)執(zhí)行器
隊(duì)列
單元測(cè)試
服務(wù)容器
文件系統(tǒng) / 云存儲(chǔ)
認(rèn)證
請(qǐng)求的生命周期
加密
模板
視圖 (View)
Laravel Homestead
Laravel 安裝指南
介紹
Command Bus
分頁(yè)
輔助方法
應(yīng)用程序結(jié)構(gòu)
HTTP 路由
HTTP 請(qǐng)求
基本用法
本地化
HTTP 中間件
結(jié)構(gòu)生成器
Facades
Laravel Elixir

HTTP 響應(yīng)

基本響應(yīng)

從路由返回字串

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

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

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

但是以大部分的路由及控制器所執(zhí)行的動(dòng)作來(lái)說(shuō),你需要返回完整的 Illuminate\Http\Response 實(shí)例或是一個(gè)視圖。返回一個(gè)完整的 Response 實(shí)例時(shí),你能夠自定義響應(yīng)的 HTTP 狀態(tài)碼以及響應(yīng)頭。Response 實(shí)例繼承了 Symfony\Component\HttpFoundation\Response 類(lèi),它提供了很多方法來(lái)建立 HTTP 響應(yīng)。

use Illuminate\Http\Response;

return (new Response($content, $status))
              ->header('Content-Type', $value);

為了方便起見(jiàn),你可以使用輔助方法 response

return response($content, $status)
              ->header('Content-Type', $value);

1提示: 有關(guān) Response 方法的完整列表可以參照 API 文檔 以及 Symfony API 文檔.`

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

如果想要使用 Response 類(lèi)的方法,但最終返回視圖給用戶,你可以使用簡(jiǎn)便的 view 方法:

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

附加 Cookies 到響應(yīng)

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

鏈?zhǔn)椒椒?/h3>

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

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

重定向

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

返回重定向

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

return redirect('user/login');

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

通常重定向至新的 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');

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

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

return redirect()->back();

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

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

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

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

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

如果你的路由有參數(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]);

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

// 路由的 URI 為:profile/{user}

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

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

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

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

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

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

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

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

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

其他響應(yīng)

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

建立 JSON 響應(yīng)

json 方法會(huì)自動(dòng)將響應(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);

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

響應(yīng)宏

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

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

return response()->caps('foo');
上一篇:HTTP 路由下一篇:擴(kuò)展框架