鍍金池/ 教程/ PHP/ HTTP 響應(yīng)
門(mén)面
Laravel Homestead
安裝及配置
測(cè)試
HTTP 中間件
加密
升級(jí)指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門(mén)指南-簡(jiǎn)單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢(xún)構(gòu)建器
視圖
驗(yàn)證
Laravel Cashier(訂購(gòu)&支付&發(fā)票)
本地化
隊(duì)列
調(diào)整器
分頁(yè)
文件系統(tǒng)/云存儲(chǔ)
貢獻(xiàn)代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請(qǐng)求
Laravel Elixir
發(fā)行版本說(shuō)明
Envoy 任務(wù)運(yùn)行器(SSH任務(wù))
序列化
Session
起步
帶用戶(hù)功能的任務(wù)管理系統(tǒng)
起步
用戶(hù)授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開(kāi)發(fā)
用戶(hù)認(rèn)證
Artisan 控制臺(tái)
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請(qǐng)求的生命周期
契約
Redis
錯(cuò)誤&日志

HTTP 響應(yīng)

1、基本響應(yīng)

所有路由和控制器都會(huì)返回某種被發(fā)送到用戶(hù)瀏覽器的響應(yīng),Laravel 提供了多種不同的方式來(lái)返回響應(yīng),最基本的響應(yīng)就是從路由或控制器返回一個(gè)簡(jiǎn)單的字符串:

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

給定的字符串會(huì)被框架自動(dòng)轉(zhuǎn)化為 HTTP 響應(yīng)。 但是大多數(shù)路由和控制器動(dòng)作都會(huì)返回一個(gè)完整的 Illuminate\Http\Response 實(shí)例或視圖,返回一個(gè)完整的 Response 實(shí)例允許你自定義響應(yīng)的 HTTP 狀態(tài)碼和頭信息,Response 實(shí)例繼承自 Symfony\Component\HttpFoundation\Response 類(lèi),該類(lèi)提供了一系列方法用于創(chuàng)建 HTTP 響應(yīng):

use Illuminate\Http\Response;

Route::get('home', function () {
    return (new Response($content, $status))
                  ->header('Content-Type', $value);
});

為方便起見(jiàn),還可以使用幫助函數(shù) response

Route::get('home', function () {
    return response($content, $status)
                  ->header('Content-Type', $value);});

注意:查看完整的 Response 方法列表,請(qǐng)移步相應(yīng)的 API 文檔以及 Symfony API 文檔

1.1 添加響應(yīng)頭

大部分響應(yīng)方法都是可以鏈?zhǔn)秸{(diào)用的,從而使得可以平滑的構(gòu)建響應(yīng)。例如,可以使用 header 方法來(lái)添加一系列響應(yīng)頭:

return response($content)
            ->header('Content-Type', $type)
            ->header('X-Header-One', 'Header Value')
            ->header('X-Header-Two', 'Header Value');

1.2 添加 Cookies

使用 response 實(shí)例的幫助函數(shù) withCookie 可以輕松添加 cookie 到響應(yīng),比如,可以使用 withCookie 方法來(lái)生成 cookie 并將其添加到 response 實(shí)例:

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

withCookie 方法接收額外的可選參數(shù)從而允許對(duì) cookie 屬性更多的自定義:

->withCookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly)

默認(rèn)情況下,Laravel 框架生成的 cookies 經(jīng)過(guò)加密和簽名,所以在客戶(hù)端不能進(jìn)行修改,如果你想要將特定的 cookies 子集在生成時(shí)取消加密,可以使用中間件 App\Http\Middleware\EncryptCookies$except 屬性:

/**
 * 需要被加密的 cookies 名稱(chēng)
 *
 * @var array
 */
protected $except = [
    'cookie_name',
];

2、其它響應(yīng)類(lèi)型

幫助函數(shù) response 可以用來(lái)方便地生成其他類(lèi)型的響應(yīng)實(shí)例,當(dāng)無(wú)參數(shù)調(diào)用 response 時(shí)會(huì)返回 Illuminate\Contracts\Routing\ResponseFactory 契約的一個(gè)實(shí)現(xiàn),該契約提供了一些有用的方法來(lái)生成響應(yīng)。

2.1 視圖響應(yīng)

如果你需要控制響應(yīng)狀態(tài)和響應(yīng)頭,還需要返回一個(gè)視圖作為響應(yīng)內(nèi)容,可以使用 view 方法:

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

當(dāng)然,如果你不需要傳遞一個(gè)自定義的 HTTP 狀態(tài)碼或者自定義頭,只需要簡(jiǎn)單使用全局的幫助函數(shù) view 即可。

2.2 JSON 響應(yīng)

json 方法會(huì)自動(dòng)將 Content-Type 頭設(shè)置為 application/json,并使用 PHP 函數(shù) json_encode方法將給定數(shù)組轉(zhuǎn)化為 JSON:

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

如果你想要?jiǎng)?chuàng)建一個(gè) JSONP 響應(yīng),可是添加 setCallbackjson 方法后面:

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

2.3 文件下載

download方法用于生成強(qiáng)制用戶(hù)瀏覽器下載給定路徑文件的響應(yīng)。download 方法接受文件名作為第二個(gè)參數(shù),該參數(shù)決定用戶(hù)下載文件的顯示名稱(chēng),你還可以將 HTTP 頭信息作為第三個(gè)參數(shù)傳遞到該方法:

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

注意:管理文件下載的 Symfony HttpFoundation類(lèi)要求被下載文件有一個(gè) ASCII 文件名。

3、重定向

重定向響應(yīng)是 Illuminate\Http\RedirectResponse 類(lèi)的實(shí)例,其中包含了必須的頭信息將用戶(hù)重定向到另一個(gè) URL,有很多方式來(lái)生成RedirectResponse實(shí)例,最簡(jiǎn)單的方法就是使用全局幫助函數(shù)redirect

Route::get('dashboard', function () {
    return redirect('home/dashboard');
});

有時(shí)候你想要將用戶(hù)重定向到前一個(gè)位置,比如,表單提交后,驗(yàn)證不通過(guò),你就可以使用 back 幫助函數(shù)返回前一個(gè) URL:

Route::post('user/profile', function () {
    // 驗(yàn)證請(qǐng)求...
    return back()->withInput();
});

3.1 重定向到命名路由

如果調(diào)用不帶參數(shù)的redirect方法,會(huì)返回一個(gè) Illuminate\Routing\Redirector 實(shí)例,從而可以調(diào)用該實(shí)例上的任何方法。比如,為了生成一個(gè) RedirectResponse到命名路由,可以使用 route方法:

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

如果路由中有參數(shù),可以將其作為第二個(gè)參數(shù)傳遞到route方法:

// For a route with the following URI: profile/{id}
return redirect()->route('profile', [1]);

如果要重定向到帶 ID 參數(shù)的路由,并從 Eloquent 模型中取數(shù)據(jù)填充表單,可以傳遞模型本身,ID 會(huì)被自動(dòng)解析出來(lái):

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

3.2 重定向到控制器動(dòng)作

你還可以生成重定向到控制器動(dòng)作,只需簡(jiǎn)單傳遞控制器和動(dòng)作名到 action方法即可。記住,你不需要指定控制器的完整命名空間,因?yàn)?Laravel 的RouteServiceProvider 將會(huì)自動(dòng)設(shè)置默認(rèn)的控制器命名空間:

return redirect()->action('HomeController@index');

當(dāng)然,如果控制器路由要求參數(shù),你可以將參數(shù)作為第二個(gè)參數(shù)傳遞給 action 方法:

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

3.3 帶一次性 Session 數(shù)據(jù)的重定向

重定向到一個(gè)新的 URL 并將數(shù)據(jù)存儲(chǔ)到一次性 session中通常是同時(shí)完成的,為了方便,可以創(chuàng)建一個(gè)RedirectResponse 實(shí)例然后在同一個(gè)方法鏈上將數(shù)據(jù)存儲(chǔ)到 session,這種方式在 action 之后存儲(chǔ)狀態(tài)信息時(shí)特別方便:

Route::post('user/profile', function () {
    // 更新用戶(hù)屬性...
    return redirect('dashboard')->with('status', 'Profile updated!');
});

當(dāng)然,用戶(hù)重定向到新頁(yè)面之后,你可以從 session 中取出并顯示這些一次性信息,比如,使用Blade 語(yǔ)法實(shí)現(xiàn)如下:

@if (session('status'))
    <div class="alert alert-success">
        {{ session('status') }}
    </div>
@endif

4、響應(yīng)宏

如果你想要定義一個(gè)自定義的響應(yīng)并且在多個(gè)路由和控制器中復(fù)用,可以使用 Illuminate\Contracts\Routing\ResponseFactory 實(shí)現(xiàn)上的 macro 方法。 比如,在一個(gè)服務(wù)提供者的boot方法中:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Contracts\Routing\ResponseFactory;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @param  ResponseFactory  $factory
     * @return void
     */
    public function boot(ResponseFactory $factory)
    {
        $factory->macro('caps', function ($value) use ($factory) {
            return $factory->make(strtoupper($value));
        });
    }
}

micro方法接收響應(yīng)名稱(chēng)作為第一個(gè)參數(shù),一個(gè)閉包函數(shù)作為第二個(gè)參數(shù),micro 的閉包在從 ResponseFactory實(shí)現(xiàn)或幫助函數(shù) response上調(diào)用 macro 名稱(chēng)的時(shí)候被執(zhí)行:

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