作为互联网典型的Web应用,接收用户请求的数据,并将处理的结果向用户进行响应,是最基础也是最必备的功能。在原生的PHP中,我们常用$_POST、$_GET、$_REQUEST和$_FILES对不同的请求接收,也用echo、var_export()、printf()等语句向用户进行响应。

在Laravel中,框架内部规定了自己的一套机制请求与响应机制。在这一节中,就让我们一起学习这个话题。

1、请求

(1) 路由参数

Laravel的参数,可以通过路由指定,并在路由的回调函数或指定的Controller中进行处理。举两个栗子:

示例1:

\Illuminate\Support\Facades\Route::any('/welcome/{id}',function ($id){
return $id;
});

在这个例子中,用户访问http://域名/welcome/6,回调函数中的$id参数就可以接收到6这个值。这里的id参数在url是必填项。

示例2:

//路由部分
\Illuminate\Support\Facades\Route::any('/welcome/{id?}',"MyController@hello"); //MyController部分
namespace App\Http\Controllers; use Illuminate\Http\Request; class MyController extends Controller
{
public function hello(Request $req,$id='')
{
return $id;
}
}

在这个例子中,用户访问http://域名/welcome/6,类MyController的hello函数中的$id参数就可以接收到6这个值。这里的id参数在url是可选项。(注意与示例1进行对比,路由与函数参数的写法均有区别)

(2) URL中GET参数的获取

无论是路由的回调函数,还是controller的行为函数,第一个参数可以用于Request类实例的注入(说白了,函数第一个参数是Request类型的变量)。

如果还有哪位小伙子不清楚什么是GET请求或GET参数,请点击文章最下方的链接联系我:)

在处理函数中,我们这样取到GET参数:

public function action(Request $req)
{
$req->query(key); //传入key值就能获取对应的value
}

(3) POST参数的获取

public function hello(Request $req)
{
$req->post(key);
}

(4) POST与GET参数混合获取(all函数可以同时获取GET和POST的参数,返回数组类型)

public function hello(Request $req)
{
$arr=$req->all(key);
$arr[key]; //这就是我们要获取的value
}

(5) COOKIE参数获取

public function hello(Request $req)
{
$req->cookie(key); //这是key对应的cookie值
}

(6) 其它

//请求路径
//假设访问的路径是http://192.168.1.5/hello/3?a=b
$req->url(); //获取的是http://192.168.1.5/hello/3
$req->fullUrl(); //获取的是http://192.168.1.5/hello/3?a=b
$req->path(); //获取的是hello/3

2、响应

(1)响应普通字符串

在行为函数是直接return字符串即可,请看下面这个栗子:

public function action(Request $req)
{
return "welcome";
}

(2)响应JSON

方法一:在行为处理函数中直接返回数组

public function action(Request $req)
{
return [key=>value]; //Laravel会先把这个数组转为json格式字符串,再传到客户端
}

方法二:调用response()->json()

public function action(Request $req)
{
return response()->json([
key=>value
]);
}

(3)响应模板

举个简单的栗子:

public function action(Request $req)
{
return view("welcome");
}

详细的请查看本系统第三篇《Laravel入坑指南(3)——模板》

(4)响应COOKIE 

/*
$name : cookie的key
$value : cookie的值
$minutes : cookie存活时间
$path : cookie所属路径,一般填"/"
$domain : 所属域名,可用于二级域名跨域
$secure : 设为true则只有在https下才可以使用
$httpOnly : 设为true则js无法获取cookie值
*/
return response(响应内容)->cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly);

(5)响应头:下面这个例子为跨域头

public function hello(Request $req,$id='')
{
return response("welcome",200)->withHeaders([
'Access-Control-Allow-Origin'=>"*",
'Access-Control-Allow-Headers'=>'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN',
'Access-Control-Expose-Headers'=>'Authorization, authenticated',
'Access-Control-Allow-Methods'=>'GET, POST, PATCH, PUT, OPTIONS',
'Access-Control-Allow-Credentials'=>'true'
]);
}

3、文件上传

(1)单文件上传:假设表单文件的key是f

public function hello(Request $req)
{
if($req->hasFile('f') && $req->file('f')->isValid())
{
$file['ext']=$req->f->extension(); //文件扩展名
$file['path']=$req->f->path(); //文件的路径
$file['mine']=$req->f->getMimeType(); //文件mime
$file['originName']=$req->f->getClientOriginalName(); //原始文件名
$file['size']=$req->f->getClientSize(); //文件尺寸 /*
$file的值
array (
'ext' => 'jpeg',
'path' => '/tmp/phpxq5lSe',
'mine' => 'image/jpeg',
'originName' => '1.jpg',
'size' => 196118,
)
*/
$file['uploadName']=sha1($file['originName']).'.'.$file['ext']; //要保存的文件名
$req->f->move(base_path().'/', $file['uploadName']); //参数1是所在目录
}
else
{
$req->f->getErrorMessage(); //错误信息
}
}

(2)多文件上传:假设表单文件的key是f[]

public function hello(Request $req,$id='')
{
if($req->hasFile('f'))
{
foreach ($req->f as $f)
{
if(!$f->isValid()) continue; $file['ext']=$f->extension(); //文件扩展名
$file['path']=$f->path(); //文件的路径
$file['mine']=$f->getMimeType(); //文件mime
$file['originName']=$f->getClientOriginalName(); //原始文件名
$file['size']=$f->getClientSize(); //文件尺寸
$file['uploadName']=sha1($file['originName']).'.'.$file['ext'];
$f->move(base_path().'/', $file['uploadName']); //参数1是所在目录
}
}
}

---------------------------  我是可爱的分割线  ----------------------------

最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

Laravel入坑指南(5)——请求与响应的更多相关文章

  1. Elasticsearch入坑指南之RESTful API

    Elasticsearch入坑指南之RESTful API Tags:Elasticsearch ES为开发者提供了非常丰富的基于Http协议的Rest API,通过简单的Rest请求,就可以实现非常 ...

  2. ElasticSearch入坑指南之概述及安装

    ---恢复内容开始--- ElasticSearch入坑指南之概述及安装 了解ElasticSearch ElasticSearch(简称ES)基于Lucene的分布式全文检索引擎.使用ES可以实现近 ...

  3. Phalcon如何切换数据库《Phalcon入坑指南系列 三》

    本系列目录 一.Phalcon在Windows上安装 <Phalcon入坑指南系列 一> 二.Phalcon入坑必须知道的功能(项目配置.控制器.模型.增.删.改.查) 三.Phalcon ...

  4. electron入坑指南

    electron入坑指南 简介 electron 实际集成chrome浏览器和node环境, 运行你写的网页 app 基本目录结构 index.html 名称可以不是index, 这个文件与普通网页的 ...

  5. C语言入坑指南-被遗忘的初始化

    前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题. 什么是初始化 初始化指的是对数据对象或者变量赋予初始值.例如: int va ...

  6. eclipse中导入外部包却无法查看对应源码或Javadoc的入坑指南

    eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应AP ...

  7. Rust入坑指南:核心概念

    如果说前面的坑我们一直在用小铲子挖的话,那么今天的坑就是用挖掘机挖的. 今天要介绍的是Rust的一个核心概念:Ownership.全文将分为什么是Ownership以及Ownership的传递类型两部 ...

  8. Rust入坑指南:鳞次栉比

    很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...

  9. Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...

  10. Rust入坑指南:朝生暮死

    今天想和大家一起把我们之前挖的坑再刨深一些.在Java中,一个对象能存活多久全靠JVM来决定,程序员并不需要去关心对象的生命周期,但是在Rust中就大不相同,一个对象从生到死我们都需要掌握的很清楚. ...

随机推荐

  1. CSS : div 高度为0的三种情况

    1, css 样式没正确绑定 ( 也就是没有设置高度 ) 2, 子元素 浮动 ( float ) 3, 子元素 绝对定位 ( position : absolute )

  2. phpcms : Uncaught Error: [] operator not supported for strings... 的解决方案

    打开/phpcms/modules/admin/classes/push_api.class.php,大概在约 141行, $fields_arr = $fields_value = ''; 将它改为 ...

  3. Linux-定时任务-cron

  4. linux环境C语言实现:h264与pcm封装成AVI格式

    ​ 前言 拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题. RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视 ...

  5. [转帖]docker exec 失败问题排查之旅

    https://plpan.github.io/docker-exec-%E5%A4%B1%E8%B4%A5%E9%97%AE%E9%A2%98%E6%8E%92%E6%9F%A5%E4%B9%8B% ...

  6. [转帖]拜托!面试请不要再问我Spring Cloud底层原理

    https://www.cnblogs.com/jajian/p/9973555.html 概述# 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大 ...

  7. [转贴]汉字编码:GB2312, GBK, GB18030, Big5

    汉字编码:GB2312, GBK, GB18030, Big5 https://www.cnblogs.com/malecrab/p/5300497.html 前一篇博文:ANSI是什么编码?中有这样 ...

  8. React数据通信父传子和子传父的使用

    组件中的props 在react中,props的特点是: 1.可以给组件传递任意类型的数据 2.props是只读的对象,只能够读取属性的值,无法修改对象 如过我们强行修改数据,会报错,告诉我们该属性是 ...

  9. css伪类和伪元素在项目中的使用-红色*显示

    CSS使用伪类给表单添加星号 <style type="text/css"> .form-item label::before { content: '*'; colo ...

  10. ABP-VNext 用户权限管理系统实战05----扩展授权类型(单点登录)

    一.适合场景: 1.我方系统在集成到别人的集成本台时一般是拿别的平台的用户名,在我方系统进行登录 2.我方系统是前后端分离,前端要拿到token 二.解决方案:自定义授权类型 我们知道Identity ...