3分钟短文:Laravel请求对象方法极多,可不是花拳绣腿
引言
web服务无外乎两点,一个是请求,一个是相应。中间经过一系列的处理,我们是为一个sandbox。无论是请求Request,还是响应Response,每个框架都会浓墨重彩地进行深度设计。
本文我们来说一下laravel的请求对象。
代码时间
一个网络请求在到达应用程序之前,经历了http的路由匹配,握手连接, 数据发送等等或简单,或复杂的步骤。也同样有多重请求方式,如GET POST PUT OPTION DELETE 等等标准协议里的内容。
laravel提供了一个助手函数 request(),暴露了一个上下文的 Request 对象可全局操作。我们本文重点说说 用于的请求数据。
比如有一条路由,我们这样便捷地定义:
Route::post('form', function (IlluminateHttpRequest $request) {
// $request->input()});
在匿名函数中,使用强制类型Request进行注入,变量$request就是一个实例化后的Request对象, 可以访问其属性和方法。
为了演示表单数据的提交,我们构建一个表单:
<form method="post" action="/post-route?utm=12345">
{{ csrf_field() }}
<input type="text" name="firstName">
<input type="submit"></form>
在此之前先定义路由,初步把请求体的数据全部打印出来:
Route::post('/post-route', function (Request $request) {
var_dump($request->all());});
调用请求Request的all方法,返回所有字段的值,并格式化为数组,输出内容类似于
[
'_token' => 'CSRF token here',
'firstName' => 'value',
'utm' => 12345]
其中要注意的是,为了显示区别,utm参数是querystring内传送的, 而firstName字段,是表单内通过POST方法传送的。两者的请求方法不一样。
那么对于用于csrf拦截的字段_token,系统生成,系统自检,我们在表单中并不使用, 可以使用 except 方法将其排除在外。路由内这样做:
Route::post('/post-route', function (Request $request) {
var_dump($request->except('_token'));});
那么返回数组中,就不会展示 _token 字段了。这类似与黑名单的功能。相对应地使用白名单,手动指定哪些字段需要展示。需要调用 only 方法:
Route::post('/post-route', function (Request $request) {
var_dump($request->only(['firstName', 'utm']));});
对于单个字段,如何判断是否存在呢?有两个方法,一个是 has(),一个是 exists()。这两者是有细微区别的,has方法要求键名存在,且数值不为空;exists方法仅要求键名存在。
if ($request->has('invalid_key')) {}
比如上方的代码键名不存在,所以返回 false。如果表单字段 firstName 不填任何值,也即是空字符串。
$request->has('firstName'); // false$request->exists('firstName'); // true
所以对于大多数的场景,我们其实是在判断是否存在键名,对值并未判断,所以exists 方法更为合适。
上述的all方法返回所有字段的值,如果用于单一字段值的获取,要使用 input()方法:
Route::post('/post-route', function (Request $request) {
$userName = $request->input('name', 'anonymous');});
第二个参数是指定如果键名不存在时的默认值。
有了input方法,我们来看更复杂的表单提交数组数据的处理办法。首先构造一个表单,并提交数组数据:
<form method="post" action="/post-route">
{{ csrf_field() }}
<input type="text" name="employees[0][firstName]">
<input type="text" name="employees[0][lastName]">
<input type="text" name="employees[1][firstName]">
<input type="text" name="employees[1][lastName]">
<input type="submit"></form>
这样的表单真是shit对不对,可是框架需要满足这样的需求。处理起来也没问题。PHP就是最为擅长处理数组,所以轻快。laravel对请求体进行数组操作, 还有更高阶的用法,下面是示例:
Route::post('/post-route', function (Request $request) {
$employeeZeroFirstName = $request->input('employees.0.firstName');
$allLastNames = $request->input('employees.*.lastName');
$employeeOne = $request->input('employees.1');});
我们可以使用明确的键名进行访问,也可以使用通配符进行匹配。上面的方法返回值如下, 大家看看不同的写法,输出会有不同。
假设4个输入框传入的值分别是 "Jim" "Smith" "Bob" "Jones",那么打印如下:
$employeeZeroFirstName = 'Jim';$allLastNames = ['Smith', 'Jones'];$employeeOne = ['firstName' => 'Bob', 'lastName' => 'Jones'];
laravel按照数组的层级,完整地返回了。整个数组结构大致如下:
[
'employees' => [
0 => [
'firstName' => 'Jim',
'lastName' => 'Smith',
],
1 => [
'firstName' => 'Bob',
'lastName' => 'Jones',
],
]]
只不过在访问的时候,使用点的方法;也可以使用通配符进行键名匹配。非常灵活。
写在最后
本文通过示例演示了laravel Request请求常用的方法获取表单数据,最重要也用的最少的数组数据的解析, 可以加深大家对于表单数据处理的逻辑。
Happy coding :-)
- Android系统线控和歌曲信息屏显的那点事
- 利用Spring中同名Bean相互覆盖的特性,定制平台的类内容。
- 关于java传参
- 浅析ButterKnife
- SQL Server常用语句
- pyecharts(一):Python可视化利器
- 如何在Python中保存ARIMA时间序列预测模型
- SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)
- sum(x) over( partition by y ORDER BY z ) 分析
- Android DataBinding 数据绑定
- Flask拾遗笔记之上下文
- switch.....case....使用最容易犯错的地方
- electron 构建跨平台桌面应用
- 两个关于字符串的经典例子
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 将有序数组转化为二叉搜索树
- 至少有K个重复字符的最长子串
- django这些查询技巧你会了吗?
- 手把手教你配置vim,小白也可以
- 【NPM库】- 0x02
- 最长有效括号
- 统计全为1的子矩形
- Android Camera1中的人脸检测
- Executors功能如此强大,ThreadPoolExecutor功不可没(一)
- dotNET:怎样处理程序中的异常(实战篇)?
- 二维背包问题
- 小程序系列之禁用视频快进
- springBoot整合Mq报错:JmsMessagingTemplate that could not be found
- TCP:测试小工具TCPing
- 对象实例化内存布局与访问定位 Krains 2020-08-14