作为互联网典型的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. MPC 是下一代私钥安全的7大原因

    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. 多重签名钱包与单一密钥钱包相比,因其提升了资产安全性,如今已成为 ...

  2. java - 冒泡排序求最值

    public class Bubble3 { public static void main(String[] args) { int[] arr; arr = new int[]{2,3,6,1}; ...

  3. 基本操作Linux

    基本操作Linux 关机,重启# 关机 shutdown -h now # 重启 shutdown -r now 查看系统,CPU信息# 查看系统内核信息 uname -a # 查看系统内核版本 ca ...

  4. [转帖]9.1 TiDB HTAP 的特点

    HTAP 是 Hybrid Transactional / Analytical Processing 的缩写.这个词汇在 2014 年由 Gartner 提出.传统意义上,数据库往往专为交易或者分析 ...

  5. [转帖]KingbaseES不同字符类型比较转换规则

    https://www.cnblogs.com/kingbase/p/14798059.html Postgresql 常用的字符数据类型的有char.varchar和text,其中 char 固定长 ...

  6. Docker镜像精简方法之二 COPY vs ADD 与镜像层

    Docker镜像精简方法之二 COPY vs ADD 与镜像层 摘要 昨天只是讲了一下大体的思路. 但是没有实操. 今天想着修改一下默认的打包镜像的命令,验证一下效果 原始命令 FROM adopto ...

  7. [转帖]Centos7 nginx访问日志文件割接

    一.yum安装nginx 二.各文件路径( /etc/nginx/nginx.conf) 1.访问日志路径:access_log /var/log/nginx/access.log main; 2.p ...

  8. [转帖]nmon使用及监控数据分析

    [使用] [监控数据分析] 参考链接:nmon监控数据分析 性能测试中,各个服务器资源占用统计分析是一个很重要的组成部分,通常我们使用nmon这个工具来进行监控以及监控结果输出. 一.在监控阶段使用类 ...

  9. Cosmic云星瀚的简单学习-测试用户创建

    摘要 上一个学习文档里面总结了: 修改domain的url之后就可以重启服务然后登录了. 今天中午创建了一个业务用户,发现还挺麻烦的 因为可能短信服务有问题, 所以我这边需要有改数据库表的需求. 这里 ...

  10. 一个简单的监控java进程获取日志的办法

    公司里面一个长时间运行的环境会出现问题, 这边简单写了一个脚本自动获取日志信息 脚本如下 注意 我的path 其实就是复用的 我们应用里面的jdk  剩下的就非常简单了. 每个日志都自动打包 并且移除 ...