Laravel框架学习(Response)

这篇博客详细介绍了Laravel框架中的响应机制,包括基本响应、添加Cookie、ResponseFactory的功能,如视图响应、JSON响应和文件下载。同时,文章讲解了RedirectResponse的使用,包括基本重定向、重定向到命名路由、控制器动作以及带一次性Session数据的重定向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Response篇
1.1 基本响应

最基本的HTTP响应只需在路由闭包或控制器动作中返回一个简单字符串即可,但是具体业务逻辑中大部分响应都是在控制器动作中返回Response实例或者视图。Response是继承自 Symfony\Component\HttpFoundation\Response的 Illuminate\Http\Response类的一个实例,我们可以使用该实例上的一系列方法来创建HTTP响应:

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

在浏览器中访问,FireBug查看响应头信息

这里写图片描述

Illuminate\Http\Response 类中还使用了ResponseTrait,header方法正是该trait提供的,除了header之外,该trait还提供了withCookie、content和status方法。header方法用于设置响应头信息,withCookie方法用于添加cookie,这两个方法都会返回调用它的Response自身对象,所以这两个方法都支持方法链(即多次调用header或withCookie方法);而content和status方法则用于返回当前响应的响应实体内容和响应状态码。

1.2 添加Cookie
我们使用withCookie方法为响应添加cookie,由于header和withCookie支持方法链,所以我们可以这样使用:

Route::get('response', function(){
   $content = 'Hello Response';
   $status = 200;
   $value = 'text/html;charset=utf-8';
   return response($content, $status)->header('Content-Type', $value)->withCookie('test','yyktest');
});

这里写图片描述
我们还可以使用该cookie的有效期、作用域等信息:

Route::get('response', function(){
   $content = 'Hello Response';
   $status = 200;
   $value = 'text/html;charset=utf-8';
   //设置cookie有效期为30分钟,作用路径为应用根目录,作用域名为test.app
   return response($content, $status)->header('Content-Type', $value)->withCookie('test','yyktest',30,'/','test.app');
});

注:withCookie方法实际上是调用了全局帮助函数cookie生成cookie,然后将cookie放到响应头中。

这里写图片描述
上图红色标注部分描述了我们在代码中自定义的cookie信息。

此外,我们还关注到该cookie是经过加密的,这一点我们在前面已经提到过,这是为了安全性考虑,如果要取消加密,在app/Http/Middleware/EncryptCookies.php文件中将对应的cookie名添加到EncryptCookies类属性$except中即可:

<?php

namespace App\Http\Middleware;

use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter;

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

此时再在浏览器中访问时,cookie的信息就变成yyktest,直接明文显示。当然,为了安全起见,我们不建议这么做。

2、ResponseFactory篇
response函数如果不传入参数会返回 Illuminate\Contracts\Routing\ResponseFactory契约的实现——Illuminate\Routing\ResponseFactory,该类中提供了多个方法用来生成更加丰富的响应类型,比如视图响应、JSON响应、文件下载等等。

2.1 视图响应

使用view方法即可返回一个视图作为响应内容:

Route::get('testView',function(){
    $value = 'text/html;charset=utf-8';
    return response()->view('hello',['message'=>'Hello view'])
        ->header('Content-Type',$value);
});

与之对应的,我们需要在resources/views下新建一个视图文件hello.blade.php,其内容如下:

{{$message}}

接下来我们在浏览器中访问http://selfstudy.com/testView,页面输出:

Hello View

还可以再简化,如果我们不需要自定义HTTP响应头,还可以直接使用全局帮助函数view:

Route::get('testView',function(){
    $value = 'text/html;charset=utf-8';
    return view('hello',['message'=>'Hello View']));
});

2.2 返回JSON/JSONP

还可以使用json方法返回json格式数据:

Route::get('testJson', function(){
   return response()->json(['id'=>123, 'name'=>'yyk']); 
});

json方法会自动设置Content-Type为application/json,并调用PHP内置函数json_encode讲数组转化为json格式字符串。

如果返回的是JSONP响应,也很简单,只需要在json后面再调用setCallback即可:

Route::get('testJson', function(){
   return response()->json(['id'=>123,'name'=>'yyk'])
   ->setCallback(request()->input('callback'));
});

2.3 文件下载
使用download方法可生成用于下载给定路径文件的响应,这里我们下载上一节上传的文件:

Route::get('testDownload',function(){  
    return response()->download(
        realpath(base_path('public/images')).'/test.jpg',
        'testyyk.jpg'
    );
});

本地测试的时候在项目public目录下新建images目录,并把test.jpg放入到该文件夹下。如 D:\www\laravel5.1\public\images\test.jpg
在浏览器中访问http://selfstudy.com/testDownload,页面将会下载test.jpg文件并保存为testyyk.jpg。

3、 RedirectResponse 重定向
重定向响应是 Illuminate\Http\RedirectResponse类的实例,我们通常使用全局帮助函数redirect来生成 RedirectResponse实例。和response类似,redirect函数如果接收参数则调用的是Illuminate\Routing\Redirector类的to方法,如果无参调用则返回的是Redirector对象实例。

3.1 基本重定向

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

如果要重定向到上一个位置,则使用back方法:

Route::post('user/profile', function () {
    // 验证请求...
    return back()->withInput();
});

3.2 重定向到命名路由
使用route方法重定向到命名路由:

Route::get('/hello/laravelacademy',['as'=>'academy',function(){
    return 'Hello LaravelAcademy';
}]);

Route::get('testResponseRedirect',function(){
    return redirect()->route('academy');
});

如果命名路由中有参数,那么我们可以在route中传入参数:

Route::get('/hello/laravelacademy/{id}',['as'=>'academy',function($id){
    return 'Hello LaravelAcademy '.$id;
}]);

Route::get('testResponseRedirect',function(){
    return redirect()->route('academy',100);
});

3.3 重定向到控制器动作
使用action方法重定向到控制器动作:

Route::resource('post','PostController');

Route::get('testResponseRedirect',function(){
    return redirect()->action('PostController@index');
});

当然也可以传递参数到action方法:

Route::get('testResponseRedirect',function(){
    return redirect()->action('PostController@show',[1]);
});

3.4 带一次性Session数据的重定向
使用with方法可以携带一次性session数据到重定向请求页面(一次性session数据即使用后立即销毁的session数据项):

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

这种特性通常在提交表单验证失败返回错误信息时很有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值