Laravel基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向
https://yq.aliyun.com/ziliao/23889
1、Response篇
1.1 基本响应
最基本的HTTP响应只需在路由闭包或控制器动作中返回一个简单字符串即可,但是具体业务逻辑中大部分响应都是在控制器动作中返回Response实例或者视图。Response是继承自
Symfony\Component\HttpFoundation\Response的
Illuminate\Http\Response类的一个实例,我们可以使用该实例上的一系列方法来创建HTTP响应:
use Illuminate\Http\Response;
Route::get('testResponse',function(){
$content = 'Hello LaravelAcademy!';
$status = 200;
$value = 'text/html;charset=utf-8';
return (new Response($content,$status))->header('Content-Type',$value);
});
在浏览器中访问,F12查看响应头信息(Chrome浏览器):
基本响应
如果我们尝试修改$status=500,则头信息如下:
基本响应2
为方便使用,我们还可以使用全局帮助函数response来替代生成Response对象实例:
Route::get('testResponse',function(){
$content = 'Hello LaravelAcademy!';
$status = 500;
$value = 'text/html;charset=utf-8';
return response($content,$status)->header('Content-Type',$value);
});
效果一样。以后我们将默认使用这种方式,不再生成Response对象实例。
此外,需要注意的是,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('testResponseCookie',function(){
$content = 'Hello LaravelAcademy!';
$status = 200;
$value = 'text/html;charset=utf-8';
return response($content,$status)->header('Content-Type',$value)
->withCookie('site','LaravelAcademy.org');
});
在浏览器中访问,F12查看Cookie信息:
生成Cookie
我们还可以使用该cookie的有效期、作用域等信息:
Route::get('testResponseCookie',function(){
$content = 'Hello LaravelAcademy!';
$status = 200;
$value = 'text/html;charset=utf-8';
//设置cookie有效期为30分钟,作用路径为应用根目录,作用域名为laravel.app
return response($content,$status)->header('Content-Type',$value)
->withCookie('site','LaravelAcademy.org',30,'/','laravel.app');
});
注:withCookie方法实际上是调用了全局帮助函数cookie生成cookie,然后将cookie放到响应头中。
再次在浏览器中访问,F12查看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
{
/**
* 不被加密的cookie名
*
* @var array
*/
protected $except = [
'site'
];
}
再次在浏览器中访问http://laravel.app:8000/testResponseCookie,F12查看Cookie信息如下:
未加密cookie
当然,为了安全起见,我们不建议这么做。
2、ResponseFactory篇
response函数如果不传入参数会返回
Illuminate\Contracts\Routing\ResponseFactory契约的实现——Illuminate\Routing\ResponseFactory,该类中提供了多个方法用来生成更加丰富的响应类型,比如视图响应、JSON响应、文件下载等等。
2.1 视图响应
使用view方法即可返回一个视图作为响应内容:
Route::get('testResponseView',function(){
$value = 'text/html;charset=utf-8';
return response()->view('hello',['message'=>'Hello LaravelAcademy'])
->header('Content-Type',$value);
});
与之对应的,我们需要在resources/views下新建一个视图文件hello.blade.php,其内容如下:
{{$message}}
接下来我们在浏览器中访问http://laravel.app:8000/testResponseView,页面输出:
Hello LaravelAcademy
还可以再简化,如果我们不需要自定义HTTP响应头,还可以直接使用全局帮助函数view:
Route::get('testResponseView',function(){
$value = 'text/html;charset=utf-8';
return view('hello',['message'=>'Hello LaravelAcademy']));
});
效果和上面一样。
2.2 返回JSON/JSONP
还可以使用json方法返回json格式数据:
Route::get('testResponseJson',function(){
return response()->json(['name'=>'LaravelAcademy','passwd'=>'LaravelAcademy.org']);
});
在浏览器中访问,F12查看响应头信息:
生成json响应
根据输出信息可见,json方法会自动设置Content-Type为application/json,并调用PHP内置函数json_encode讲数组转化为json格式字符串。
如果返回的是JSONP响应,也很简单,只需要在json后面再调用setCallback即可:
Route::get('testResponseJson',function(){
return response()->json(['name'=>'LaravelAcademy','passwd'=>'LaravelAcademy.org'])
->setCallback(request()->input('callback'));
});
2.3 文件下载
使用download方法可生成用于下载给定路径文件的响应,这里我们下载上一节上传的文件:
Route::get('testResponseDownload',function(){
return response()->download(
realpath(base_path('public/images')).'/laravel-5-1.jpg',
'Laravel学院.jpg'
);
});
在浏览器中访问yun_qi_img/testResponseDownload,页面将会下载laravel-5-1.jpg文件并保存为Laravel学院.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');
});
在浏览器中访问http://laravel.app:8000/testResponseRedirect,页面会跳转到http://laravel.app:8000/hello/laravelacademy并输出:
Hello LaravelAcademy
如果命名路由中有参数,那么我们可以在route中传入参数:
Route::get('/hello/laravelacademy/{id}',['as'=>'academy',function($id){
return 'Hello LaravelAcademy '.$id;
}]);
Route::get('testResponseRedirect',function(){
return redirect()->route('academy',100);
});
在浏览器中访问http://laravel.app:8000/testResponseRedirect,页面会跳转到http://laravel.app:8000/hello/laravelacademy/100并输出:
Hello LaravelAcademy 100
3.3 重定向到控制器动作
使用action方法重定向到控制器动作:
Route::resource('post','PostController');
Route::get('testResponseRedirect',function(){
return redirect()->action('PostController@index');
});
在浏览器中访问http://laravel.app:8000/testResponseRedirect,则页面会跳转到http://laravel.app:8000/post并输出对应内容。
当然也可以传递参数到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!');
});
这种特性通常在提交表单验证失败返回错误信息时很有用。
Laravel基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向的更多相关文章
- 生成并返回 json 结果文件
#region 生成并返回 json 结果文件 /// <summary> /// 生成并返回 json 结果文件 /// </summary> /// <param n ...
- SpringMVC总结三:请求Controller返回视图类型以及请求方式、参数介绍
视图解析,请求Controller返回的视图类型: @Controller @RequestMapping("/test") public class TestController ...
- jquery ajax 后台响应成功,返回正确json但不执行success方法,执行error的问题
昨天被这问题卡了好几个小时.查看http状态码:是200.而且返回了预想的json字符串.但执行的是error方法,不执行success方法.在网上查了一下,才发现是后台页面返回的json字符串格式不 ...
- EF5+MVC4系列(12) 在主视图中直接用RenderAction调用子Action,并返回视图(Return View)或者分部视图(Return PartialView); 从主Action传值到子Action使用TempData传值;TempData高级用法
结论: ViewData 适用于 在一次请求中 传递数据 . 比如我们从 主Action 到 主视图, 然后在 主视图中 用 RenderAction 请求子Action的时候,就是算作 一次请求 ...
- 关于SpringBoot如何返回视图
别人已经写过了,我就不重复造轮子了.我赞成他的方案:Spring Boot使用方法小札(1):Web应用返回jsp页面 如果配置完之后,访问相应的Controller 还是得不到对应的页面,考虑用以下 ...
- 第一百八十七节,jQuery,知问前端--cookie 插件,注册成功后生成cookie,显示登录状态
jQuery,知问前端--cookie 插件 学习要点: 1.使用 cookie 插件 2.注册直接登录 Cookie 是网站用来在客户端保存识别用户的一种小文件.一般来用库可以保存用户登 录信息.购 ...
- springmvc返回视图(解析)
1.什么是视图? 视图就是展示给用户看的结果.可以是很多形式,例如:html.JSP.excel表单.Word文档.PDF文档.JSON数据.freemarker模板视图等等. 2.传统JSP和JST ...
- [Swift通天遁地]四、网络和线程-(11)将服务器返回的JSON映射为实例对象
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- @responsebody注解的作用就是让viewresolver不起作用,不返回视图名称而是直接返回的return object
@responsebody注解的作用就是让viewresolver不起作用,不返回视图名称而是直接返回的return object 2.也可以再方法上添加@ResponseBody注解, 用于这个类里 ...
随机推荐
- mysql实现行拼接、列拼接
举例:有t_person表如下: 一.mysql行拼接: 拼接某一行: 无分隔符:select CONCAT(id,idcard,`status`,content) from t_perso ...
- PHP 从 MongoDb 中查询数据怎么样实现
一.软件环境(版本非必须) php v5.6 扩展:MongoDB nginx v1.11 mongodb v3.2 note: 必须安装MongoDB扩展 二.连接 $client = new Mo ...
- openssl生成证书 - CSDN博客
大家都可以生成公钥.私钥对,无法确认公钥对到底是谁的. 如果能够确定公钥到底是谁的,就不会有这个问题了.例如,如果收到“黑客”冒充“服务器”发过来的公钥,经过某种检查,如果能够发现这个公钥不是“服务器 ...
- CSS浏览器兼容解决方案
1.在ie8的甑别上,如何让样式只对ie8起作用? 用ie浏览器独有的文档注释的方式.像这样: <!DOCTYPE html> <!--> <html class=&qu ...
- Thrift源码分析(一)-- 基本概念
我所在的公司使用Thrift作为基础通信组件,相当一部分的RPC服务基于Thrift框架.公司的日UV在千万级别,Thrift很好地支持了高并发访问,并且Thrift相对简单地编程模型也提高了服务地开 ...
- 【时光回溯】【JZOJ3566】【GDKOI2014】阶乘
题目描述 输入 第一行有一个正整数T,表示测试数据的组数. 接下来的T行,每行输入两个十进制整数n和base. 输出 对于每组数据,输出一个十进制整数,表示在base进制下,n!结尾的零的个数. 样例 ...
- CC-Debugger 最小调试接法
CC-Debugger 最小调试接法 以 CC2541 为例,最少需要四根 DD DC RST GND. 一般 VCC 目标调试板都有,所以这里你需要将 CC-Debugger 的 PIN 2 和 P ...
- 中国境内PE\VC\投资公司名单
中国境内PE\VC\投资公司名单 1.青云创投 2.高盛 3.红杉资本 4.鼎晖创投 5.枫丹国际 6.派杰投资银行 7.凯雷投资 8.长安私人资本 9.格林雷斯 10.汉能资本 11.启明创投 12 ...
- docker search
命令:docker search [root@iZ943kh74qgZ ~]# docker search --help Usage: docker search [OPTIONS] TERM Sea ...
- springboot web开发【转】【补】
pom.xml引入webjars的官网 https://www.webjars.org/ https://www.thymeleaf.org/doc/tutorials/3.0/usingthymel ...