TP5模型验证器自定义验证规则无效

这个问题比较少见,在开发文档中也没有提到,具体场景如下:

//实例化验证器
$ruleValidate = Loader::validate('TestRule');
//自定义验证规则
$ruleValidate->rule([
    'name' => 'require'
]);
$model = new TestModel;
$result = $model->validate()->save($someData);

以上代码正常来说是会正常执行的,并正常验证。
但是当时就出现了一个奇怪的情况,验证器的确生效了,但是使用的验证规则是验证器中预定义的验证规则,而没有我在验证器中临时增加的自定义规则。
经过阅读框架源码排查是因为
thinkphp/library/think/Model.php中的validate函数,如下:

	/**
     * 设置字段验证
     * @access public
     * @param array|string|bool $rule  验证规则 true表示自动读取验证器类
     * @param array             $msg   提示信息
     * @param bool              $batch 批量验证
     * @return $this
     */
    public function validate($rule = true, $msg = [], $batch = false)
    {
        if (is_array($rule)) {
            $this->validate = [
                'rule' => $rule,
                'msg'  => $msg,
            ];
        } else {
            $this->validate = true === $rule ? $this->name : $rule;
        }
        $this->batchValidate = $batch;
        return $this;
    }

当函数入参 $rule 为空时默认值为true,当 $rule = true时 $this->validate 就会读取模型中定义的 $this->name。所以当模型中定义了 $name这个成员变量时, 加载的验证器名称就等于模型中定义的 $name。
假设数据库表名为staff时,在模型中定义 $name = “staff”,validate函数还是能正确的加载验证器的。但是当数据表表名不等于验证器的类名时,就加载不到验证器了,假设表名为:staff_relate

结论:
如果在模型中定义了 $name 属性,就有可能导致模型验证器无法正确加载验证器类,导致临时定义的验证器规则不生效。

PS:
不过这种情况在TP5中才会存在,因为tp5.1之后的版本都废除了模型验证器,并建议开发者改为在控制器中自行调用验证器进行验证。而且个人认为在控制器中自行调用验证器对数据进行验证,无论从安全性和扩展性来说都会是更优的实践。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值