所需验证器 (Yii2) 的 targetAttribute(或类似的东西)

targetAttribute (Or something similar) for required validator (Yii2)

所以,这是我的场景。我有一个名为 URL 的模型。 URL 具有以下属性:link(必需)、scheme(必需,但不是 safe.scheme 是从 link 解析而来的)和一些其他属性好吧,这与这个问题无关。

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

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() 并且它 returns 为真,即使它不应该(或者应该是,因为无论如何都不需要该属性)。

那么,我的问题 2:有没有办法强制触发 validateScheme,无论属性是空的还是非空的?我似乎没有在文档中找到执行此操作的方法。

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

我的问题 1,在那种情况下是:有没有办法为 scheme 分配 targetAttribute,以便错误消息显示在 link 下方?

P.S。我知道我可以在控制器中做到这一点。我不想那样做。我只想使用模型。

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

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

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

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

查看更多here.