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

引言web服务无外乎两点 , 一个是请求 , 一个是相应 。 中间经过一系列的处理 , 我们是为一个sandbox 。无论是请求Request , 还是响应Response , 每个框架都会浓墨重彩地进行深度设计 。
暮年|3分钟短文:Laravel请求对象方法极多,可不是花拳绣腿本文我们来说一下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方法 , 我们来看更复杂的表单提交数组数据的处理办法 。首先构造一个表单 , 并提交数组数据:


推荐阅读