所需验证器(Yii2)的targetAttribute(或类似内容)

所需验证器(Yii2)的targetAttribute(或类似内容),yii2,yii2-validation,Yii2,Yii2 Validation,这是我的设想。我有一个叫做URL的模型。URL具有以下属性:链接(必需)、方案(必需,但不安全。方案是从链接解析的)以及一些其他属性,这些属性与此问题无关 现在,我为该方案制作了一个自定义验证器,如下所示: public function validateScheme($attribute, $param) { if(empty($this->scheme)){ $this->addError('link', Yii::t('app', 'This is a

这是我的设想。我有一个叫做URL的模型。URL具有以下属性:
链接
(必需)、
方案
(必需,但不安全。方案是从链接解析的)以及一些其他属性,这些属性与此问题无关

现在,我为该方案制作了一个自定义验证器,如下所示:

public function validateScheme($attribute, $param) {
    if(empty($this->scheme)){

        $this->addError('link', Yii::t('app', 'This is an invalid URL.'));

    }  
    if (!in_array($this->scheme, $this->allowedSchemes)) {
        $this->addError('link', Yii::t('app', 'This is an invalid URL.'));

    }
}
URL的规则:

 public function rules() {
        return [
            ['link', 'required', 'message' => Yii::t('app', 'URL can\'t be blank.')],
            [['link'], 'safe'],
            [['link'], 'string'],
            ['scheme', 'validateScheme']
            ];
    }
当遇到一个无效的方案时,例如ftp,这种方法可以很好地工作

但是,当输入一个完全无效的URL时,
scheme
将保持为空,并且不会触发
validateScheme
,因为不需要属性
scheme
。为了验证,我调用了
$model->validate()
,它返回true,即使它不应该返回true(或者应该返回true,因为该属性不是必需的)

那么,我的问题2:有没有办法强制触发
validateScheme
,不管属性是空的还是非空的?我似乎在文档中找不到这样做的方法

然后我尝试了另一种方法,并将
scheme
设置为必填字段。问题是,
scheme
字段不安全,并且不在表单中。因此,URL不会保存,但不会显示错误

在这种情况下,我的问题1是:是否有办法为
方案
分配
targetAttribute
,以便错误消息显示在
链接
下面


另外,我知道我可以在控制器中完成这项工作。我不想那样做。我只想用这个模型

好的,在
规则()中设置默认值解决了我的问题。修改的
规则()


另一种解决方案是,您可以启用verify on empty(默认情况下,它不验证空字段和非必填字段),而不是使用默认值。大概是这样的:

public function rules() {
    return [
        ['link', 'required', 'message' => Yii::t('app', 'URL can\'t be blank.')],
        [['link'], 'string'],
        ['scheme', 'validateScheme', 'skipOnEmpty' => false]
    ];
}

请参阅更多。

谢谢,伙计。正是我想要的。不知道我怎么会错过这一个lol:)对不起,我忘了提。。如果字段已经有另一个规则,则不需要设置
安全
public function rules() {
    return [
        ['link', 'required', 'message' => Yii::t('app', 'URL can\'t be blank.')],
        [['link'], 'string'],
        ['scheme', 'validateScheme', 'skipOnEmpty' => false]
    ];
}