Laravel5.1 響應--Response


最基本的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);
});

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

 

其實為了方便使用,我們可以使用全局幫助函數:

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('ArticlesController@index');
});

也可以跟上參數:

Route::resource('articles', 'ArticlesController');

Route::get('/testRedirect',function(){
    return redirect()->action('ArticlesController@edit',[2]);
});

 

帶一次性session數據的重定向

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

Route::resource('articles', 'ArticlesController');

Route::get('/testRedirect',function(){
    return redirect()->action('ArticlesController@index')->with('message','歡迎來到文章列表');
});

對應的index方法:

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

home.blade.php中的代碼:

@extends('app')

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM