分享

表单验证

 小马哥技术屋 2016-11-23
永远不要相信用户的数据,所以现在给表单提交添加数据验证。
我们添加一个User 验证器(位于application/index/validate/User.php ),代码如下:
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
// 验证规则
protected $rule = [
'nickname' => 'require|min:5|token',
'email' => 'require|email',
'birthday' => 'dateFormat:Y-m-d',
];
}
User 验证器添加了三个属性的验证规则,分别表示:
昵称必须,而且最小长度为5
邮箱必须,而且必须是合法的邮件地址
生日可选,如果填写的话必须为 Y-m-d 格式的日期格式
对属性可以使用多个验证规则,除非使用了require 开头的规则,否则所有的验证都是可选的(也就是说
(6)输入和验证
本文档使用 看云 构建 - 99 -
有值才验证),多个验证之间用| 分割,并且按照先后顺序依次进行验证,一旦某个规则验证失败,后续的
规则就不会再进行验证(除非设置批量验证方式则统一返回所有的错误信息)。
更多的内置规则可以参考完全开发手册的内置规则一节。
如果我们的验证规则里面使用了| ,为了避免混淆则必须用数组方式定义验证规则,验证规则定义修改如
下:
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
// 验证规则
protected $rule = [
'nickname' => ['require', 'min'=>5, 'token'],
'email' => ['require', 'email'],
'birthday' => ['dateFormat' => 'Y|m|d'],
];
}
然后对控制器的add 方法则稍加修改,在save 方法之前添加一个validate 方法即可:
// 新增用户数据
public function add()
{
$user = new UserModel;
if ($user->allowField(true)->validate(true)->save(input('post.'))) {
return '用户[ ' . $user->nickname . ':' . $user->id . ' ]新增成功';
} else {
return $user->getError();
}
}
当我们没有输入任何表单数据就直接提交的话,页面会输出结果:
nickname不能为空
当我们输入昵称为wo 的时候点击提交
(6)输入和验证
本文档使用 看云 构建 - 100 -
页面输出结果为:
nickname长度不能小于 5
当输入一个错误的邮箱格式后提交
页面提示错误信息为:
email格式不符
(6)输入和验证
本文档使用 看云 构建 - 101 -
当输入一个 1990/08/09 的生日时候
页面提示的错误信息是:
birthday必须使用日期格式:Y-m-d
错误提示
目前为止,提示的错误信息都是系统默认的,接下来我们来定义提示信息。
首先,如果只是希望修改属性名称的话,可以直接使用下面的验证规则定义方式:
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
// 验证规则
protected $rule = [
'nickname|昵称' => 'require|min:5',
'email|邮箱' => 'require|email',
'birthday|生日' => 'dateFormat:Y-m-d',
];
}
现在我们提交一个错误的邮箱,
(6)输入和验证
本文档使用 看云 构建 - 102 -
提示的错误信息为:
邮箱格式不符
输入错误的生日格式的时候,提示的错误信息为:
生日必须使用日期格式:Y-m-d
如果希望完整定义错误提示信息的话,可以使用:
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
// 验证规则
protected $rule = [
['nickname', 'require|min:5', '昵称必须|昵称不能短于5个字符'],
['email', 'email', '邮箱格式错误'],
['birthday', 'dateFormat:Y-m-d', '生日格式错误'],
];
}
现在我们提交一个错误的邮箱,提示的错误信息为:
邮箱格式错误
提交一个错误的生日格式后,提示的错误信息变成:
(6)输入和验证
本文档使用 看云 构建 - 103 -
生日格式错误
系统提供了丰富的内置验证规则,具体可以参考完全开发手册。
自定义验证规则
系统的验证规则可以满足大部分的验证场景,但有时候我们也需要自定义特殊的验证规则,例如我们需要验
证邮箱必须为thinkphp.cn 域名的话,可以在User 验证器中添加验证规则如下:
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
// 验证规则
protected $rule = [
['nickname', 'require|min:5', '昵称必须|昵称不能短于5个字符'],
['email', 'checkMail:thinkphp.cn', '邮箱格式错误'],
['birthday', 'dateFormat:Y-m-d', '生日格式错误'],
];
// 验证邮箱格式 是否符合指定的域名
protected function checkMail($value, $rule)
{
return 1 === preg_match('/^\w+([-+.]\w+)*@' . $rule . '$/', $value);
}
}
自定义验证规则也支持返回动态的错误信息,只需要在验证方法里面返回错误信息字符串即可,例如:
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
// 验证规则
protected $rule = [
['nickname', 'require|min:5', '昵称必须|昵称不能短于5个字符'],
['email', 'checkMail:thinkphp.cn', '邮箱格式错误'],
['birthday', 'dateFormat:Y-m-d', '生日格式错误'],
];
// 验证邮箱格式 是否符合指定的域名
protected function checkMail($value, $rule)
{
$result = preg_match('/^\w+([-+.]\w+)*@' . $rule . '$/', $value);
if (!$result) {
return '邮箱只能是' . $rule . '域名';
} else {
return true;
}
}
}
(6)输入和验证
本文档使用 看云 构建 - 104 -
如果输入了一个不是thinkphp.cn 域名的邮箱地址,会提示如下错误信息:
邮箱只能是thinkphp.cn域名
控制器验证
前面我们讲了在模型中使用验证器进行数据验证的方法,下面来讲下如何在控制器中进行数据验证。
验证器类的定义不变,现在修改下控制器类:
namespace app\index\controller;
use app\index\model\User as UserModel;
use think\Controller;
class User extends Controller
{
// 创建用户数据页面
public function create()
{
return view();
}
public function add()
{
$data = input('post.');
// 数据验证
$result = $this->validate($data,'User');
if (true !== $result) {
return $result;
}
$user = new UserModel;
// 数据保存
$user->allowField(true)->save($data);
return '用户[ ' . $user->nickname . ':' . $user->id . ' ]新增成功';
}
}
然后访问
http:///user/create
当输入一个错误的邮箱格式后提交
(6)输入和验证
本文档使用 看云 构建 - 105 -
页面提示错误信息为:
email格式不符
如果有一些个别的验证没有在验证器里面定义,也可以使用静态方法单独处理,例如下面对birthday字段单独
验证是否是一个有效的日期格式:
namespace app\index\controller;
use app\index\model\User as UserModel;
use think\Controller;
use think\Validate;
class User extends Controller
{
// 创建用户数据页面
public function create()
{
return view();
}
public function add()
{
$data = input('post.');
// 验证birthday是否有效的日期
$check = Validate::is($data['birthday'],'date');
if (false === $check) {
return 'birthday日期格式非法';
}
$user = new UserModel;
// 数据保存
$user->save($data);
return '用户[ ' . $user->nickname . ':' . $user->id . ' ]新增成功';
}
}
(6)输入和验证
本文

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多