3分钟短文:Laravel跟用户打交道,从拿他们的数据开始

引言本来讲完路由和控制器 , 应该接着讲一讲视图的 , 但是鉴于视图的功能实在太枯燥 , 况且是前端页面 , 免不了写一些js和css 。 而laravel是偏重后端的 , 所以为了给后端的开发同学缓冲的时间 , 我们跳过视图 , 先来说说用户数据的获取和处理 , 这几乎是任何应用必备之功能 。
3分钟短文:Laravel跟用户打交道,从拿他们的数据开始文章插图
用户数据同时又是危险的!本文不会教你规避危险!
代码时间我们在讲路由规划的时候 , 说了如何使用url的位置参数绑定的方式进行导向 , 其实那也是一种获取用户输入数据的方式 ,只不过 , 传入的位置参数一般都人畜无害 , 公开访问 , 任你来来往往 。
如果是单个用户的私密数据 , 必然是不能直接url内嵌传输的 。
laravel把用户的输入存储在 Input 对象内 , 而从逻辑上看 , 用户输入应该归属于请求项的 , 所以 Request 也继承了 Input 的方法和数据 。比如有下面的路由:
Route::post('form', function (Illuminate\Http\Request $request) {// $request->method()});模拟的是一个表单地址 , 通过post方法传送数据 , 然后使用 Request 方法 。 可供使用的获取方法 , 我们一一道来 。
先说说 $request->all() , 这一个是打印所有的输入数据 , 比如表单内可能有下面这些字段 。 HTML 内容你们将就看一下哈!

{{ csrf_field() }}
为了调试数据 , 我们的路由这样注册:
Route::post('/post-route', function (Request $request) {var_dump($request->all());});【3分钟短文:Laravel跟用户打交道,从拿他们的数据开始】大家猜猜会输出些什么内容呢?
/*** [* '_token' => 'CSRF token here',* 'firstName' => 'value',* 'utm' => 12345* ]*/没错儿 , 就是看到的post表单的字段 firstName , 还有 querystring 的查询参数 utm , 还有一个是用于 CSRF 防护的laravel内置函数 , 默认的表单字段就是 __token , 所以大可不必费心 。
但是有代码洁癖的同学会觉得受不了 , 这个不是我的字段 , 我在代码里也用不到 , 我不想看到这个 __token , 这个陌生的变量 。 可以 , 我们在请求参数内直接过滤掉就好了:
Route::post('/post-route', function (Request $request) {var_dump($request->except('_token'));});其中 , except() 方法就是用来过滤某些字段 , 不需要使用的 。 与之对应的就是 only() 方法 , 是指定哪些是用的字段 。 这样用:
$request->only(['firstName', 'utm']);还有些时候逻辑判断有些键是否存在 , laravel提供了两种方式判断是否存在 , 一个是 has, 一个是 exists 。 有同学会疑问 , 为什么有了 has还要 exists呢?因为他们的作用不同 。
has方法不仅会判断该键存在 , 如果该键的值是 空(比如 null , 空字符串 , false , 0 , 空数组 , 空对象等等) , 也是判断为false的 。 所以就有必要使用 exists 单纯地判断键的存在与否 , 大家用的时候一定要注意这个细微的差别 。
用法很简单 , 直接调用方法即可:
if ($request->has('utm')) {// Do some work}如果对于输入值键不存在 , 我们也可以为其设置一个默认值 , 这就是 input 方法的第二个参数 , 使用如下调用:
Route::post('/post-route', function (Request $request) {$userName = $request->input('name', 'anonymous');});如果用户没有传入 name 字段 , 那么就用 anonymous 替代 。
上面说的都是简单的键值对 , 还有一种表单 , 传入的字段可能会是数组 , 比如下面这个:
{{ csrf_field() }}
laravel内获取数组可以使用点式方式读取 , 这是因为laravel解析的时候使用了助手类 Arr 的通用方法 。 比如获取某个键:
$employeeZeroFirstName = $request->input('employees.0.firstName');明确地指定键名 , 并对应好层级即可 。 还可以使用星号匹配某一层级所有的键:
$allLastNames = $request->input('employees.*.lastName');或者仅指定某个键 , 后面不管多少层级原样返回:
$employeeOne = $request->input('employees.1');具体用法读者可以查看源码或文档 , 深入研究一下Arr操作类的用法 。
写在最后本文几乎涵盖了用户输入input方法的最为常用的一些方法 , 我们只讲了怎么正常地获取用户数据 , 没有讲如何验证数据有效性 。 因为前端验证几乎形同虚设 , 最后能写到数据库的数据 , 还是要应用程序把关 。