Yii2自定义独立验证

时间:2015-09-17 19:57:47

标签: php validation yii2

好的,我相信我会有很多自定义验证,所以我决定按照Yii Standalone Validation Doc创建一个独立的验证类。

这个特殊的验证器是为了确保填写company_name或name,所以要么是必需的。

我在app \ components \ validators \ BothRequired.php

中创建了这个类
<?php
namespace app\components\validators;
use Yii;
use yii\validators\Validator;

class BothRequired extends Validator
{
    public function validateAttribute($model, $attribute)
    {
       //validation code here
    }
}

这是模型

public function rules()
{
    return [
        ['company_name', BothRequired::className(), 'skipOnEmpty' => false, ],
    ];
}

然而,这个验证需要在本例中将一些参数传递给验证,我需要发送需要检查的第二个属性。我似乎无法解决如何做到这一点,如果我在模型本身中创建验证规则然后我可以传递$params但我不知道如何传递给这个独立类。

还有一点需要注意的是,对我来说更好的是,如果我可以拥有一个包含所有自定义验证器的类,而不是每个验证器的文件。

有什么想法吗?

此致

1 个答案:

答案 0 :(得分:4)

行,

在@gandaliter的帮助下,我找到了答案

验证员类

namespace app\components\validators;
use Yii;
use yii\validators\Validator;

class BothRequired extends Validator
{
    public $other;
    public function validateAttribute($model, $attribute)
    {
        if (empty($model->$attribute) && empty($model->{$this->other})) {
            $this->addError($model, $attribute, 'Either '.$attribute.' or '.$this->other.' is required!');
            $this->addError($model, $this->other, 'Either '.$attribute.' or '.$this->other.' is required!');
        }
    }
}

模型规则

public function rules()
{
    return [
        ['company_name', BothRequired::className(), 'other'=>'contact_name', 'skipOnEmpty' => false, ],
    ];
}

正如您所看到的,您必须声明要发送的属性,在这种情况下,它是$other,然后在代码中使用它$this->other

然后我可以验证这两个项目。

我希望这可以解决它

利安

P.S。另一方面我提到过....如何将所有验证器放在一个类中?