Laravel—响应

响应

所有路由、控制器处理完业务逻辑之后都会返回一个发送到用户浏览器的响应,Laravel提供多种不同的方式来获取响应,将数组转化为JSON响应

字符串 & 数组

直接在函数中使用return返回,框架会自动将字符串转换为一个完整的HTTP响应

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

Route::get('/',function()
{
    return [1,2,3];
});

Response类

返回一个完整的response实例允许自定义响应的HTTP状态码和头信息,Response实例继承自Symfony\Component\HttpFoundation\Response基类,该类提供了一系列方法用于创建HTTP响应

添加响应头

header方法添加一系列响应头,也可以通过withHeaders方法指定头信息组添加到响应


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

//使用数组形式
return response($content)
    ->withHeaders([
        'Content-Type' => $type,
        'X-Header-One' => 'Header Value',
        'X-Header-Two' => 'Header Value',
    ]);

添加Cookie到响应

cookie方法生成Cookie并添加到响应实例

return response->cookie(‘name’,’value’,$minutes);

还可以使用Cookie门面,queue方法接受cookie实例或创建的必要参数,这些Cookie会在响应被发送到浏览器之前添加到响应

Cookie::queue(‘author’,’value’,’minutes’);

Cookie加密

默认情况下,Laravel框架生成的Cookie都经过了加密的签名,以免在客户端被篡改。可以通过app\Http\Middleware\EnctryptCookies提供的$except属性取消特定的Cookie加密

<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;

class EncryptCookies extends Middleware
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        //’cookie_name',
    ];
}

重定向

重定向响应是Illuminate\Http\RedirectResponse类的实例,包含了必要的头信息将用户重定向到另一个URL

使用辅助函数

redirect函数可以重定向到指定的地址

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

back函数返回到前一个URL

Route::post('user/profile',function()
{
    //返回上一个页面并自动在表单中填入已填信息
    return back()->withInput();
});

重定向到命名路由

如果调用不带参数的redirect方法,会返回一个Illuminate\Routing\Redirector实例,然后可以使用Redirector实例上的所有方法,route方法可以重定向到指定的路由,如果路由有参数,可以将其作为第二个参数传递到route方法

return redirect()->route(‘login’,[‘id’=>1]);

重定向到控制器动作

action方法可以生成控制器指定动作的URL,如果控制器有参数,可以将其作为第二个参数传递给action方法

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

重定向到外部域名

away方法可以重定向到指定的网址

return redirect()->away(‘http://xiao-ming9.github.io');

视图响应

view方法能够返回视图,也可以使用全局辅助函数view

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

//全局辅助函数
Route::get('/view/response',function(){
    return view('hello');
});

JSON响应

json方法会自动将Content-Type头设置为application/json,并使用PHP函数将给定数组转化为JSON格式数据:

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

如果想要创建一个JSONP响应,可以在json方法之后调用withCallback方法

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

也可以直接使用jsonp方法:

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

文件下载

download方法用于生成用户浏览器下载给定路径文件的响应,第一参数为文件,可以使用相对路径(相对于public中的index.php)或绝对路径,第二第三参数可选,第二个参数为自定义文件名,第三个参数为HTTP头信息

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

文件响应

file方法可用于直接在用户浏览器显示文件,,接受文件路径作为第一个参数,头信息作为第二个参数

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