Laravel基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向

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!’);
});
这种特性通常在提交表单验证失败返回错误信息时很有用。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/113207.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • CSS的十八般技巧

    CSS的十八般技巧

  • 国产操作系统: 盘点8款国产Linux桌面操作系统[通俗易懂]

    国产操作系统: 盘点8款国产Linux桌面操作系统[通俗易懂]2014年4月8日起,美国微软公司停止了对WindowsXPSP3操作系统提供服务支持,这引起了社会和广大用户的广泛关注和对信息安全的担忧。在这种背景下,国家出于计算机安全考虑,加大了针对操作系统开发力度,各软件企业纷纷开发自主操作系统。国产操作系统多以Linux为基础二次开发,今天我们为大家盘点一下二零一八年值得用户使用的国产Linux桌面操作系统。1.深度操作系统…

  • pcep协议什么意思_PCEP – magnate3 – 博客园[通俗易懂]

    pcep协议什么意思_PCEP – magnate3 – 博客园[通俗易懂]PCEP是什么PCEP的全称是PathComputationElementCommunicationProtocol,直译过来就是路径计算单元通信协议。简单概括就是一个通信协议,基于TCP的应用层协议,具体用来干什么,会在下面逐步介绍。PCEP的发展曲线PCEP最初是想将路由器上的CSPF功能抽取出来,实现一个集中算路的能力,最初的时候是不温不火的;后面随着SDN大热,PCEP由于具备下发…

  • 服务器安装linux系统安装教程_linux服务器重装系统

    服务器安装linux系统安装教程_linux服务器重装系统一、linux镜像的刻录1.首先打开电脑上面任意浏览器(IE、MicrosoftEdge、chrome、Firefox),输入网址https://www.centos.org/我们可以看到如下界面选择立即获取centos下载最新的安装镜像,复制下载链接(http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64…

  • 什么时候调用layoutSubviews

    什么时候调用layoutSubviews如果你想强制更新布局,不要直接调用此方法。你可以调用setNeedsLayout方法;如果你想立即数显你的views,你需要调用layoutIfNeeded方法。 layoutSubviews作用 layoutSubviews是对subviews重新布局。比如,我们想更新子视图的位置的时候,可以通过调用layoutSubviews方法,既可以实现对子视图重新布局。 layo

  • linux中常用的文件查找命令–find命令的用法

    linux中常用的文件查找命令–find命令的用法

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号