程序员小助手|过滤掉七七八八的数据,3分钟短文:Laravel的“南天门”
引言
上一章我们教会大家如何从用户表单内正确地获取数据 , 可是没有讲 , 获取到的数据到底有啥用 , 或者说 , 有的用户提交的数据压根儿就没正经填 , 那些错乱无效的数据 , 如果直接放到数据库 , 纯粹是对数据库的污染 。
文章图片
所以本文就来说说应用程序最重要的一环 , 验证数据 。
代码时间
获取数据的途径除了早前介绍的在路由地址内通过位置参数绑定的方式 , 还有上一章介绍的表单提交的方式 , 还有一些比如在get请求内附加查询参数进行传送的 , 不管形式是什么 , 我们需要将其统一口径 , 将其规划为规范的数据格式 , 然后只用把数据发给验证器 。
如果你对源码稍加留意 , 可能就会注意到 , laravel的Controller类引入了ValidatesRequests这个验证trait 。
classControllerextendsBaseController{useAuthorizesRequests,DispatchesJobs,ValidatesRequests;}
其内部声明了一个validate方法 , 使我们可以直接在上下文调用验证 。 首先假设有两个路由 , 在routes/web.php文件内添加下面的代码:
Route::get('recipes/create','RecipesController@create');Route::post('recipes','RecipesController@store');
其中get方法是用于渲染recipe创建的表单 , post方法用于接收表单来的数据 , 我们先实现get的控制器方法 。 在文件app/Http/Controllers/RecipesController.php内添加diamante:
publicfunctioncreate(){returnview('recipes.create');}
视图文件模板什么的 , 我们都略过不讲 , 就假设表单有了 , 用户也可以提交上数据来了 。 下面实现post方法接收数据 , 并进行验证:
publicfunctionstore(Request$request){$this->validate($request,['title'=>'required|unique:recipes|max:125','body'=>'required']);//数据有效}
注意上面的验证部分有一个隐式约定 , 就是传入的$request对象 , 在验证器内默认会使用$request->all()或$request->input()获取全部的输入字段和数据 。 validate方法传入的第二个参数 , 是一个验证规则数组 。 上面列出来的都是内置规则 , 简单介绍一下吧:
required:这个字段必填
unique:数据库这个字段值必须唯一不重样
max:这个字段最长125个字符
那么有的同学会立马提出疑问:
那个validate方法如何验证不通过 , 执行啥动作 , 也没见控制器内有什么捕获异常的代码?
是的 , 这是laravel框架写好了 , 如果验证失败 , 会使用MessageBag这些类来状态验证失败的信息 , 然后将错误信息渲染到公共模板部分 , 使用$errors接收 , 这是一个对象 , 可以手动遍历输出 。
如果你想手动处理 , 那么只要在视图内使用下面的代码打印即可 , 因为错误信息是全局的 。
@if($errors->any())<ulid=''errors''>@foreach($errors->all()as$error)<li>{{$error}}</li>@endforeach</ul>@endif
这都是通用的 , 贴到项目里就可以起作用的 。
下面我们讲解一下手动使用验证器怎么组织代码 。 比如不想把验证代码的逻辑写到控制器里 , 你可以选择在路由的时候就进行验证 , 在路由文件内修改上述代码:
Route::post('recipes',function(IlluminateHttpRequest$request){$validator=Validator::make($request->all(),['title'=>'required|unique:recipes|max:125','body'=>'required']);if($validator->fails()){returnredirect('recipes/create')->withErrors($validator)->withInput();}//验证通过});
大家看到了 , 验证规则部分没有一丝丝改变 , 只是传入的$request请求对象我们必须调用all()方法对其格式化为数组 。 然后显式地使用$validator->fails()方法验证是否验证失败 。
推荐阅读
- 程序员为教师妻子开发应用:将iPhone变成文档摄像头
- 悔哭!一程序员误把7500个比特币当垃圾扔掉,估算约2.4亿美元
- 2.4亿美元打水漂!程序员小哥把7500个比特币当垃圾扔掉 硬盘找不回
- 程序员开发抢茅台脚本:2天就刷榜Github
- 为什么我喜欢C语言,却非常讨厌C++?一位国外程序员的回答
- 程序员怎么保护头发?雷军回应
- 北美程序员Tinder翻车实录
- 导航|攻坚“卫星导航信号弱”难题,高德程序员联手武大学子夺得国际室内定位大赛冠军
- 长沙|视频|聚焦“数字英雄”长沙银行冠名全国首档程序员电视真人秀
- 孙玲|从流水线女工逆袭成高薪程序员 一度爆红的她现在咋样了?