3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据
引言
上一章我们教会大家如何从用户表单内正确地获取数据,可是没有讲,获取到的数据到底有啥用,或者说,有的用户提交的数据压根儿就没正经填,那些错乱无效的数据,如果直接放到数据库,纯粹是对数据库的污染。
所以本文就来说说应用程序最重要的一环,验证数据。
代码时间
获取数据的途径除了早前介绍的在路由地址内通过位置参数绑定的方式, 还有上一章介绍的表单提交的方式,还有一些比如在get请求内附加查询参数进行传送的, 不管形式是什么,我们需要将其统一口径,将其规划为规范的数据格式,然后只用把数据发给验证器。
如果你对源码稍加留意,可能就会注意到,laravel的 Controller 类引入了 ValidatesRequests 这个验证 trait。
class Controller extends BaseController
{
use AuthorizesRequests, 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:
public function create()
{
return view('recipes.create');
}
视图文件模板什么的,我们都略过不讲,就假设表单有了,用户也可以提交上数据来了。下面实现 post 方法接收数据,并进行验证:
public function store(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())
<ul id="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()) {
return redirect('recipes/create')
->withErrors($validator)
->withInput();
}
// 验证通过
});
大家看到了,验证规则部分没有一丝丝改变,只是传入的 $request 请求对象我们必须调用 all() 方法对其格式化为数组。然后显式地使用 $validator->fails() 方法验证是否验证失败。
如果验证失败,构建 Response 对象进行重定向,并使用 withErrors 语法糖将验证提示信息返回,而重定向的页面内,可以使用 $errors 变量获取到所有的错误信息。这就组成了一个验证的闭环。
写在最后
本文讲了一个非常关键的验证器操作,让大家明白这个功能如何使用,并没有深入源码或者深度定制错误验证。 还有验证规则,千奇百怪,内置的规则都有很多,用得到的,用不到的,在处理复杂业务逻辑的时候, 还要祭出自定义验证规则这把大宝剑,不过都是后话了。
Happy coding :-)
我是@程序员小助手,专注编程知识,圈子动态的IT领域原创作者
- 程序员炒股,如何计算股票投资组合的风险和收益
- Docker 容器化部署运维 OpenStack 和 Ceph
- 关于设计模式的思考
- Spring 框架之 AOP 原理剖析
- Java 平台反应式编程(Reactive Programming)入门
- 从原理到实例,他用区块链技术做一了个COIN 客户端
- 解锁Spring Data Redis的正确使用姿势
- 互联网厂工必知必会:SQL基础篇
- 算法入门,其实可以像读小说一样有趣
- 互联网中小型企业的持续集成CICD
- Hybris平台Web架构模式演变:前后端分离
- 资源控制在大数据和云计算平台中的应用
- SharifCTF 2018 Crypto writeup
- 如何使用ABSL代码调用Web service
- 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
- 配合JAVA的AJAX使用
- 手把手教你,嘴对嘴传达------Apache网页优化
- jQuery通过Ajax实现请求后台接口数据
- Git常规操作
- 手把手教你,嘴对嘴传达 ----源码编译安装部署LAMP平台(LAMP平台与编译安装详解,Apache,MySQL与PHP源码编译安装,LAMP平台搭建论坛)
- Vue点击切换样式
- ElementUI引入到vue项目开发
- 手把手教你,嘴对嘴传达------Apache(安全优化防盗链、隐藏版本信息)
- spring框架应用系列三:切面编程(带参数)
- 排障集锦:九九八十一难之第六难!(98)Address already in use: AH00072: make_sock: could not bind to address ::80
- Vue页面中引用自定义组件
- Vue如何引用Vant组件
- js表单验证工具包
- 手把手教你,嘴对嘴传达------Nginx网站服务(访问状态统计,基于域名,端口,IP的虚拟web主机访问)
- lib-flexible引入到Vue做移动端rem布局