NO IMAGE

最基本的HTTP響應只需在路由閉包或控制器動作中返回一個簡單字串即可,但是具體業務邏輯中大部分響應都是在控制器動作中返回Response例項或者檢視。Response是繼承自 Symfony\Component\HttpFoundation\Response的 Illuminate\Http\Response類的一個例項,我們可以使用該例項上的一系列方法來建立HTTP響應:

 

Route::get('testResponse', function (){
$content = '測試response';
$status = 200;
$value = 'text/html;charset=utf-8';
$response = new \Illuminate\Http\Response($content,$status);
return $response->header('Content-Type', $value);
});

 

我們可以使用瀏覽器的開發者工具檢視此次響應。

 

其實為了方便使用,我們可以使用全域性幫助函式:

public function test(){
return response()->json([
'name' => 'laravel學院,優質laravel中文學習資源平臺',
'state' => 'CA'
],200);
}

 

Route::get('testResponse', function (){
$content = '測試response';
$status = 500;
$value = 'text/html;charset=utf-8';
return response($content,$status)->header('Content-Type',$value);
});

 

以上程式碼我們把狀態碼修改成了500,使用瀏覽器的開發者工具可以檢視頭資訊,此外我們使用的response()是全域性幫助函式,以後我們將預設使用這種方式 它們的效果是一樣的,不再生成Response物件例項。

此外,需要注意的是,Illuminate\Http\Response 類中還使用了ResponseTraitheader方法正是該trait提供的,除了header之外,該trait還提供了withCookiecontentstatus方法。

header方法用於設定響應頭資訊,withCookie方法用於新增cookie,這兩個方法都會返回撥用它的Response自身物件,所以這兩個方法都支援方法鏈(即多次呼叫headerwithCookie方法);而contentstatus方法則用於返回當前響應的響應實體內容和響應狀態碼。

 

新增cookie

正如上面提到的,我們使用withCookie方法為響應新增cookie,由於headerwithCookie支援方法鏈,所以我們可以這樣使用:

 

Route::get('testResponse', function (){
$content = '測試response';
$status = 200;
$value = 'text/html;charset=utf-8';
return response($content,$status)->header('Content-Type',$value)->withCookie('site','addCookie');
});

 

在瀏覽器工具中可以清楚的看見名為site的cookie被新增了。

如果有需要 可以指定cookie的有效期,作用域資訊等:

return response($content,$status)->header('Content-Type',$value)->withCookie('site','addCookie',30,'/','test.app');

我們可以觀察到cookie是加密的,這也是為了安全考慮,如果你不想加密cookie的話 到app/Http/Middleware/EncryptCookies.php檔案中將對應的cookie名新增到EncryptCookies類屬性$except中即可:

    protected $except = [
'site',
];

極力反對這樣的做法。。。

 

ResponseFactory

我們在上面所用到的全域性幫助函式 response() 方法  當不傳入任何引數時 該方法內部會返回一個ResponseFactory給我們,它是Illuminate\Contracts\Routing\ResponseFactory契約的實現。

ResponseFactory提供了非常多的方法來生成豐富的相應型別,如:試圖響應,json,檔案下載。

 

檢視相應

Route::get('testResponse', function (){
$value = 'text/html;charset=utf-8';
return response()->view('hello',['message'=>'我們正在學習response'])->header('Content-Type',$value);
});

然後我們只需要建立hello.blade.php檔案 將message傳入就好了。

如果你不需要自定義響應頭的話 直接使用view()這個全域性幫助函式會更方便,效果是一樣的:

Route::get('testResponse', function (){
return view('hello',['message'=>'我們正在學習response']);
});

 

Json相應

Route::get('testResponse', function (){
return response()->json(['id'=>1, 'name'=>'ask']);
});

使用瀏覽器開發者工具檢視,根據輸出資訊可見,json方法會自動設定Content-Typeapplication/json,並呼叫PHP內建函式json_encode講陣列轉化為json格式字串。

 

檔案下載

 

Route::get('testResponse', function (){
return response()->download(
realpath(base_path('public/images')).'/20150621200925_NMjYu-2.jpeg',
'testDownload.jpeg'
);
});

 

 

RedirectResponse–重定向

重定向我們之前使用過,重定向響應是 Illuminate\Http\RedirectResponse類的例項,我們通常使用全域性幫助函式redirect來生成 RedirectResponse例項。和response類似,redirect函式如果接收引數則呼叫的是Illuminate\Routing\Redirector類的to方法,如果無參呼叫則返回的是Redirector物件例項。

最基本的重定向

 

Route::get('testRedirect', function (){
return redirect('/test');
});
Route::get('/test',function (){
return '測試重定向';
});

 

使用back方法 重定向到上一個位置:

Route::get('/back', function (){
return back()->withInput();
});

 

重定向到路由命名

 

Route::get('testRedirect', function (){
return redirect()->route('update',[100]);
});
Route::get('/articles/update/{id}',['as'=>'update', function($id){
return '修改文章'.$id;
}]);

 

如果沒有引數的話 就不用帶引數。

 

重定向到控制器動作

Route::resource('articles', 'ArticlesController');
Route::get('/testRedirect',function(){
return redirect()->action('[email protected]');
});

也可以跟上引數:

Route::resource('articles', 'ArticlesController');
Route::get('/testRedirect',function(){
return redirect()->action('[email protected]',[2]);
});

 

帶一次性session資料的重定向

這種重定向很有用,使用with方法可以攜帶一次性session資料到重定向請求頁面(一次性session資料即使用後立即銷燬的session資料項):

Route::resource('articles', 'ArticlesController');
Route::get('/testRedirect',function(){
return redirect()->action('[email protected]')->with('message','歡迎來到文章列表');
});

對應的index方法:

    public function index()
{
return view('home');
}

home.blade.php中的程式碼:

 

@extends('app')
@section('content')
@if(!empty(session('message')))
{{session('message')}}
@endif
@stop