从一个例子理解ThinkPHP6中的自定义验证器

博客讲述了在ThinkPHP框架中如何自定义验证规则,确保`contact`字段既非空也符合邮箱或手机号格式。初始规则未强制要求`contact`非空,导致空字符串能通过验证。修正后的验证器添加了`require`规则,确保字段必填,并详细说明了自定义验证函数的返回值对验证结果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        首先有这样的需求:有这样的一个字段(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;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值