永远不要相信用户的数据,所以现在给表单提交添加数据验证。 我们添加一个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)输入和验证 本文 |
|
来自: 小马哥技术屋 > 《Thinkphp5.0》