? ? ? ? 首先有这样的需求:有这样的一个字段(contact),这个字段必须有值,并且邮箱和手机号码均可,那么这里肯定是需要自定义验证规则,我的自定义规则如下:
<?php
namespace app\validate;
use think\Validate;
class Message extends Validate{
protected $rule = [
'username' => 'require|max:25',
'contact' => 'checkContact'
];
protected $message = [
'username.require' => '名称必须',
];
protected function checkContact($value){
// echo $value;
$reg_email = "/^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/";
$reg_phone = "/^[1][3,4,5,7,8,9][0-9]{9}$/";
if(preg_match($reg_email, $value) || preg_match($reg_phone, $value)){
return true;
}else{
return "联系方式指定没写好";
}
}
}
? ? ? ? 后来我发现contract字段写空居然直接能过,非常困惑,难道它不应该经过正则匹配吗?空字符串难道能过邮箱和手机号的正则匹配吗?后来发现根本没有进checkContact,这里我的理解是:如果在$rule中对该字段的校验没有明确写"require",那么当该字段为空时则不会进行验证。虽然这和自己的第一想法有差别,但框架内部机制的确如此。
? ? ? ? 最后附上修改好的自定义验证器,这里有一个小细节需要注意,自定义验证函数protected function checkContact的返回值为true表示验证通过,false表示验证失败,同时若返回字符串则为错误信息中的的msg字段。其优先级比$message高。
<?php
namespace app\validate;
use think\Validate;
class Message extends Validate{
protected $rule = [
'username' => 'require|max:25',
'contact' => 'require|checkContact'
];
protected $message = [
'username.require' => '后台:名称必须!',
'contact.require' => '后台:联系方式必须填写!',
'contact.checkContact'=> '后台:联系方式不合法'
];
protected function checkContact($value){
// echo $value;
$reg_email = "/^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/";
$reg_phone = "/^[1][3,4,5,7,8,9][0-9]{9}$/";
if(preg_match($reg_email, $value) || preg_match($reg_phone, $value)){
return true;
}else{
return false;
}
}
}
|