牛骨文教育服务平台(让学习变的简单)
博文笔记

ThinkPHP5 表单请求和验证 - 06

创建时间:2017-08-03 投稿人: 浏览次数:158
永远不要相信用户的数据,所以现在给表单提交添加数据验证。
我们添加一个User 验证器(位于apps/index/validate/User.php ),代码如下:
<?php

namespace appindexvalidate;

use thinkValidate;

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 开头的规则,否则所有的验证都是可选的(也就是说


有值才验证),多个验证之间用| 分割,并且按照先后顺序依次进行验证,一旦某个规则验证失败,后续的
规则就不会再进行验证(除非设置批量验证方式则统一返回所有的错误信息)。
更多的内置规则可以参考完全开发手册的内置规则一节。
如果我们的验证规则里面使用了| ,为了避免混淆则必须用数组方式定义验证规则,验证规则定义修改如
下:
<?php

namespace appindexvalidate;

use thinkValidate;

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 的时候点击提交

页面输出结果为:
nickname长度不能小于 5
当输入一个错误的邮箱格式后提交
页面提示错误信息为:
email格式不符


当输入一个 2017/08/03 的生日时候
页面提示的错误信息是:
birthday必须使用日期格式:Y-m-d
错误提示
目前为止,提示的错误信息都是系统默认的,接下来我们来定义提示信息。
首先,如果只是希望修改属性名称的话,可以直接使用下面的验证规则定义方式:
<?php

namespace appindexvalidate;

use thinkValidate;

class User extends Validate
{
    // 验证规则
    protected $rule = [
        "nickname|昵称" => "require|min:5",
        "email|邮箱" => "require|email",
        "birthday|生日" => "dateFormat:Y-m-d",
    ];
}
现在我们提交一个错误的邮箱,

提示的错误信息为:
邮箱格式不符
输入错误的生日格式的时候,提示的错误信息为:
生日必须使用日期格式:Y-m-d
如果希望完整定义错误提示信息的话,可以使用:
<?php

namespace appindexvalidate;

use thinkValidate;

class User extends Validate
{
    // 验证规则
    protected $rule = [
        ["nickname", "require|min:5", "昵称必须|昵称不能短于5个字符"],
        ["email", "email", "邮箱格式错误"],
        ["birthday", "dateFormat:Y-m-d", "生日格式错误"],
    ];
}

现在我们提交一个错误的邮箱,提示的错误信息为:
邮箱格式错误
提交一个错误的生日格式后,提示的错误信息变成:

生日格式错误
系统提供了丰富的内置验证规则,具体可以参考完全开发手册。
自定义验证规则
系统的验证规则可以满足大部分的验证场景,但有时候我们也需要自定义特殊的验证规则,例如我们需要验
证邮箱必须为contoso.org域名的话,可以在User 验证器中添加验证规则如下:
<?php

namespace appindexvalidate;

use thinkValidate;

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 appindexvalidate;

use thinkValidate;

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;
        }
    }
}


如果输入了一个不是contoso.org 域名的邮箱地址,会提示如下错误信息:
邮箱只能是contoso.org域名
控制器验证
前面我们讲了在模型中使用验证器进行数据验证的方法,下面来讲下如何在控制器中进行数据验证。
验证器类的定义不变,现在修改下控制器类:
<?php

namespace appindexcontroller;

use appindexmodelUser as UserModel;
use thinkController;

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://contoso.org/user/create
当输入一个错误的邮箱格式后提交页面提示错误信息为:
email格式不符
如果有一些个别的验证没有在验证器里面定义,也可以使用静态方法单独处理,例如下面对birthday字段单独
验证是否是一个有效的日期格式:
<?php

namespace appindexcontroller;

use appindexmodelUser as UserModel;
use thinkController;
use thinkValidate;

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 . " ]新增成功";
    }
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。