Laravel入坑指南(5)——请求与响应
作为互联网典型的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)——请求与响应的更多相关文章
- Elasticsearch入坑指南之RESTful API
Elasticsearch入坑指南之RESTful API Tags:Elasticsearch ES为开发者提供了非常丰富的基于Http协议的Rest API,通过简单的Rest请求,就可以实现非常 ...
- ElasticSearch入坑指南之概述及安装
---恢复内容开始--- ElasticSearch入坑指南之概述及安装 了解ElasticSearch ElasticSearch(简称ES)基于Lucene的分布式全文检索引擎.使用ES可以实现近 ...
- Phalcon如何切换数据库《Phalcon入坑指南系列 三》
本系列目录 一.Phalcon在Windows上安装 <Phalcon入坑指南系列 一> 二.Phalcon入坑必须知道的功能(项目配置.控制器.模型.增.删.改.查) 三.Phalcon ...
- electron入坑指南
electron入坑指南 简介 electron 实际集成chrome浏览器和node环境, 运行你写的网页 app 基本目录结构 index.html 名称可以不是index, 这个文件与普通网页的 ...
- C语言入坑指南-被遗忘的初始化
前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题. 什么是初始化 初始化指的是对数据对象或者变量赋予初始值.例如: int va ...
- eclipse中导入外部包却无法查看对应源码或Javadoc的入坑指南
eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应AP ...
- Rust入坑指南:核心概念
如果说前面的坑我们一直在用小铲子挖的话,那么今天的坑就是用挖掘机挖的. 今天要介绍的是Rust的一个核心概念:Ownership.全文将分为什么是Ownership以及Ownership的传递类型两部 ...
- Rust入坑指南:鳞次栉比
很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...
- Rust入坑指南:亡羊补牢
如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...
- Rust入坑指南:朝生暮死
今天想和大家一起把我们之前挖的坑再刨深一些.在Java中,一个对象能存活多久全靠JVM来决定,程序员并不需要去关心对象的生命周期,但是在Rust中就大不相同,一个对象从生到死我们都需要掌握的很清楚. ...
随机推荐
- CSS : div 高度为0的三种情况
1, css 样式没正确绑定 ( 也就是没有设置高度 ) 2, 子元素 浮动 ( float ) 3, 子元素 绝对定位 ( position : absolute )
- phpcms : Uncaught Error: [] operator not supported for strings... 的解决方案
打开/phpcms/modules/admin/classes/push_api.class.php,大概在约 141行, $fields_arr = $fields_value = ''; 将它改为 ...
- Linux-定时任务-cron
- linux环境C语言实现:h264与pcm封装成AVI格式
前言 拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题. RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视 ...
- [转帖]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% ...
- [转帖]拜托!面试请不要再问我Spring Cloud底层原理
https://www.cnblogs.com/jajian/p/9973555.html 概述# 毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术.不过大 ...
- [转贴]汉字编码:GB2312, GBK, GB18030, Big5
汉字编码:GB2312, GBK, GB18030, Big5 https://www.cnblogs.com/malecrab/p/5300497.html 前一篇博文:ANSI是什么编码?中有这样 ...
- React数据通信父传子和子传父的使用
组件中的props 在react中,props的特点是: 1.可以给组件传递任意类型的数据 2.props是只读的对象,只能够读取属性的值,无法修改对象 如过我们强行修改数据,会报错,告诉我们该属性是 ...
- css伪类和伪元素在项目中的使用-红色*显示
CSS使用伪类给表单添加星号 <style type="text/css"> .form-item label::before { content: '*'; colo ...
- ABP-VNext 用户权限管理系统实战05----扩展授权类型(单点登录)
一.适合场景: 1.我方系统在集成到别人的集成本台时一般是拿别的平台的用户名,在我方系统进行登录 2.我方系统是前后端分离,前端要拿到token 二.解决方案:自定义授权类型 我们知道Identity ...