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中就大不相同,一个对象从生到死我们都需要掌握的很清楚. ...
随机推荐
- 理解Asp.net MVC模式
MVC是模型(Model).视图(View).控制器(Controller)的缩写,它是Web应用程序中一种常用的架构模式.这种模式将应用程序大体上分为3层,即Model层.View层和Control ...
- [转帖]windows10彻底关闭Windows Defender的4种方法
https://zhuanlan.zhihu.com/p/495107049 Windows Defender是windows10系统自带的杀毒软件.默认情况下它处于打开的状态.大多数第三方的杀毒软件 ...
- [转帖]TiDB 查询优化及调优系列(三)慢查询诊断监控及排查
https://zhuanlan.zhihu.com/p/509984029 本章节介绍如何利用 TiDB 提供的系统监控诊断工具,对运行负载中的查询进行排查和诊断.除了 上一章节介绍的通过 EX ...
- ext4 扩容磁盘的方式方法
ext4 扩容磁盘的方式方法 背景 前期一直处理xfs,lvm磁盘的扩容 很少处理ext4的磁盘扩容 今天发现自己竟然对这一块有盲区. 晚上回家自己学习研究了会儿, 发现知识点还挺多 所以总结一下. ...
- [转帖]jmeter实现分布式压测
分布式实现的前提条件: 1.master机器和奴隶机的jmeter要一致 a. jmeter版本要一致 b.jdk主要版本要一致,比如都是jdk1.8,后面的小版本不一样不影响 c.jmeter脚本中 ...
- [转帖]记录自己安装内存带宽测试工具——Stream过程
测试环境: CPU:Kunpeng 920 8Core MEM:16G Storage:200G OS:openEuler 20.03 (LTS-SP3) 1 服务器资源监控工具--Stream 1. ...
- echarts定义饼状图的指向线内容
定义饼状图的指向线内容 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- vulnhub靶场渗透学习
攻击机:192.168.100.251 目标机:192.168.100.17 netdiscover netdiscover -r 192.168.100.1/24 Currently scannin ...
- python从新手到安装指南
说到python我是跟着官方文档自学入门,本文适用于windows 操作系统,基于Inter和amd的CPU(涵盖市面80%的电脑) 下载和安装python 对于window操作系统的初学者,进入 p ...
- Unity SetActive Event
网上查了一下Unity的SetActive变化事件没有找到,我想到用另一种思路来实现这个事件通知,它可用来调试是何处把某个gameobject隐藏掉了 Unity提供了这两个函数,OnEnable,O ...