laravel 基礎(chǔ)教程 —— 響應(yīng)

HTTP 響應(yīng)

基礎(chǔ)響應(yīng)

所有的路由和控制器都應(yīng)該返回某種響應(yīng)發(fā)送回給用戶的瀏覽器,laravel提供了多種不同的方式來返回響應(yīng)。最基本的響應(yīng)就是簡單的在路由或控制器中返回字符串:

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

這里返回的字符串會被laravel自動的轉(zhuǎn)換為HTTP響應(yīng)發(fā)送出去.

響應(yīng)對象

大多數(shù)時候,路由或者控制器的行為都應(yīng)該返回Illuminate\Http\Response實例或者viewResponse實例允許你便利的對響應(yīng)頭和響應(yīng)的狀態(tài)進行定制化.一個Response實例繼承自Symfony\Component\HttpFoundation\Response類,該類提供了多種方法來生成一個HTTP響應(yīng):

use Illuminate\Http\Response;

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

laravel也提供了便利的response全局幫助函數(shù):

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

所有可以使用的Response實例的方法,你可以查看 API 文檔Symfony API文檔.

附加響應(yīng)頭

Response實例的大多數(shù)方法都是允許進行鏈式調(diào)用的坦刀,你可以使用鏈式調(diào)用來流利的構(gòu)建響應(yīng)。例如,你可以使用header方法去添加多種響應(yīng)頭在其被發(fā)送到用戶客戶端之前:

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

或者你可以使用withHeaders方法來通過指定的數(shù)組添加請求頭到響應(yīng):

return response($content)
         ->withHeaders([
           'Content-Type' => $type,
           'X-Header-One' => 'Header Value',
           'X-Header-Two' => 'Header value'
         ]);

添加cookie到響應(yīng)

Response實例的cookie可以簡單的追加cookie信息到響應(yīng)鲤遥。例如沐寺,你可以使用cookie方法來生成cookie并附加到響應(yīng)中:

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

cookie方法允許你添加額外的參數(shù)來進一步定制化你的cookie屬性:

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

默認的,laravel中所有的cookie都是經(jīng)過簽證加密的,所以客戶端的用戶是沒辦法修改或者解讀的.所以如果你想在生成某些cookie時盖奈,禁用默認的加密混坞,你需要在App\Http\Middleware\EncreyptCookies中間件的$except屬性中進行追加:

protected $except = [
  'cookie_name'
];

其它響應(yīng)類型

幫助方法response也可以用來便利的生成其它類型的響應(yīng)實例,如果你使用response幫助方法不傳遞任何參數(shù)卜朗,那么它會返回一個實現(xiàn)了Illuminate\Contracts\Routing\ResponseFactory contract的實例拔第。該契約提供了多種有用的方法來生成響應(yīng).

視圖響應(yīng)

如果你想控制響應(yīng)的響應(yīng)頭與狀態(tài),并且你也需要返回一個視圖作為響應(yīng)的內(nèi)容场钉,那么你可以使用view方法:

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

當然蚊俺,如果你并不需要定制化響應(yīng)的狀態(tài)或者響應(yīng)頭,那么你可以直接使用全局幫助方法view逛万。

JSON響應(yīng)

json方法會自動的設(shè)置響應(yīng)頭的Content-Typeapplication/json,以及使用json_encode方法將提供的數(shù)組轉(zhuǎn)換為JSON:

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

如果你想要生成jsonp的響應(yīng)泳猬,那么你可以使用json方法然后附加setCallback方法:

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

文件下載

download方法可以在返回一個強制用戶端瀏覽器進行下載指定路徑文件的響應(yīng)。download方法也允許傳遞第二個參數(shù)作為瀏覽器下載時的文件名,你也可以傳遞http響應(yīng)頭數(shù)組作為第三個參數(shù):

return response()->download($pathToFile);

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

注意:Symfony HttpFoundation需要被下載的文件有一個ASCII文件名

文件響應(yīng)

file方法允許你在瀏覽器直接顯示image或pdf類型的文件來代替直接下載宇植。該方法接收文件路徑作為第一個參數(shù)得封,也可以接收HTTP響應(yīng)頭數(shù)組作為第二個參數(shù):

return response()->file($pathToFile);

return response()->file($pathToFile, $headers);

重定向

重定向響應(yīng)是一個Illuminate\Http\RedirectResponse類的實例,它包含了所有重定向到指定URI所需要的響應(yīng)頭信息指郁。laravel提供了多種方式去生成重定向?qū)嵗?最簡單的方式莫過于使用全局幫助方法redirect:

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

有時候你需要將用戶重定向到上一次請求的地址忙上,那么你可以使用全局幫助方法back。因為這里用到了session闲坎,所以你必須要保證你的路由使用了session中間件疫粥,默認的laravel的路由都被包裹在web路由組中,web中間件組中已經(jīng)包含了session中間件:

Route::post('user/profile', function () {
  // Validate the request...

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

重定向至命名路由

當你使用redirect方法而不傳遞任何參數(shù)時腰懂,laravel將返回Illuminated\Routing\Redirector的一個實例梗逮,該實例允許你使用一些方法來處理重定向信息,例如,為了生成重定向到命名路由绣溜,你可以使用route方法:

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

如果命名路由也含有參數(shù)慷彤,那么你可以傳遞第二個參數(shù)到route方法:

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

如果你需要重定向的路由是使用Eloquent模型的id作為參數(shù)識別的路由,那么你可以直接在route方法中傳遞用戶實例,它會自動被解析到id:

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

重定向至控制器行為

你也可以生成重定向信息到控制器的某個行為.你可以簡單的通過action方法傳遞控制器名稱和控制器行為來做到這些.你應(yīng)該注意怖喻,你并不需要特別的指出控制器的全部命名空間,因為laravel的RouteServiceProvider已經(jīng)自動的設(shè)置了默認的命名空間:

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

當然底哗,如果你的控制器行為也接收其他的參數(shù),你同樣可以在action方法中傳遞第二個參數(shù):

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

重定向并閃存session

你可以通過RedirectResponse實例的鏈式調(diào)用來做到在生成重定向信息的同時閃存seession數(shù)據(jù)锚沸,這在執(zhí)行行為之后存儲消息狀態(tài)的場景尤其有用:

Route::post('user/profile', function () {
  // Update the user's profile...

  return redirect('dashboard')->with('status', 'profile updated'); 
});

當然跋选,在用戶重定向到新頁面時,你是可以訪問到閃存的會話信息的咒吐,例如,在blade模板中,你可以這么使用:

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

響應(yīng)宏

如果你想自定義某種可復(fù)用的響應(yīng)恬叹,你可以使用Response facade的 macro方法或者提供Illuminate\Contracts\Routing\ResponseFactory的一個實現(xiàn):

<?php

namespace App\Providers;

use Response;
use Illuminate\Support\ServiceProvider;

class ResponseMacroServiceProvider extends ServiceProvider {
  public function boot() {
    Response::macro('caps', function ($value) {
      return Response::make(strtoupper($value));
    }); 
  }
}

macro方法接收一個別名作為第一個參數(shù)候生,接收一個閉包作為第二個參數(shù)。閉包會在訪問ResponseFactory實現(xiàn)的實例的動態(tài)屬性macro別名時執(zhí)行绽昼,或者通過全局幫助方法response:

return response()->caps('foo');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唯鸭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子硅确,更是在濱河造成了極大的恐慌目溉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菱农,死亡現(xiàn)場離奇詭異缭付,居然都是意外死亡,警方通過查閱死者的電腦和手機循未,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門陷猫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人的妖,你說我怎么就攤上這事绣檬。” “怎么了嫂粟?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵娇未,是天一觀的道長。 經(jīng)常有香客問我星虹,道長零抬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任搁凸,我火速辦了婚禮媚值,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘护糖。我一直安慰自己褥芒,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布嫡良。 她就那樣靜靜地躺著锰扶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寝受。 梳的紋絲不亂的頭發(fā)上坷牛,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音很澄,去河邊找鬼京闰。 笑死颜及,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蹂楣。 我是一名探鬼主播俏站,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼痊土!你這毒婦竟也來了肄扎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赁酝,失蹤者是張志新(化名)和其女友劉穎犯祠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酌呆,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡衡载,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肪笋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片月劈。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖藤乙,靈堂內(nèi)的尸體忽然破棺而出猜揪,到底是詐尸還是另有隱情,我是刑警寧澤坛梁,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布而姐,位于F島的核電站,受9級特大地震影響划咐,放射性物質(zhì)發(fā)生泄漏拴念。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一褐缠、第九天 我趴在偏房一處隱蔽的房頂上張望政鼠。 院中可真熱鬧,春花似錦队魏、人聲如沸公般。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽官帘。三九已至,卻和暖如春昧谊,著一層夾襖步出監(jiān)牢的瞬間刽虹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工呢诬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涌哲,地道東北人胖缤。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像阀圾,于是被迫代替她去往敵國和親草姻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容