首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

3分钟短文:Laravel请求对象方法极多,可不是花拳绣腿

引言

web服务无外乎两点,一个是请求,一个是相应。中间经过一系列的处理,我们是为一个sandbox。无论是请求Request,还是响应Response,每个框架都会浓墨重彩地进行深度设计。

本文我们来说一下laravel的请求对象。

代码时间

一个网络请求在到达应用程序之前,经历了http的路由匹配,握手连接, 数据发送等等或简单,或复杂的步骤。也同样有多重请求方式,如GET POST PUT OPTION DELETE 等等标准协议里的内容。

laravel提供了一个助手函数request(),暴露了一个上下文的 Request 对象可全局操作。我们本文重点说说 用于的请求数据。

比如有一条路由,我们这样便捷地定义:

Route::post('form',function(Illuminate\Http\Request$request){

// $request->input()

});

在匿名函数中,使用强制类型Request进行注入,变量$request就是一个实例化后的Request对象, 可以访问其属性和方法。

为了演示表单数据的提交,我们构建一个表单:

{{csrf_field()}}

在此之前先定义路由,初步把请求体的数据全部打印出来:

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方法,我们来看更复杂的表单提交数组数据的处理办法。首先构造一个表单,并提交数组数据:

{{csrf_field()}}

这样的表单真是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'=>[

=>[

'firstName'=>'Jim',

'lastName'=>'Smith',

],

1=>[

'firstName'=>'Bob',

'lastName'=>'Jones',

],

]

]

只不过在访问的时候,使用点的方法;也可以使用通配符进行键名匹配。非常灵活。

写在最后

本文通过示例演示了laravel Request请求常用的方法获取表单数据,最重要也用的最少的数组数据的解析, 可以加深大家对于表单数据处理的逻辑。

Happy coding :-)

我是@程序员小助手,持续分享编程知识,欢迎关注。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200913A01F3Z00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券