ThinkPHP5 表单请求和验证 - 06
永远不要相信用户的数据,所以现在给表单提交添加数据验证。
我们添加一个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 . " ]新增成功";
}
}
我们添加一个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 . " ]新增成功";
}
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。