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

时间:2016-02-07 16:20:35

标签: yii2 yii2-validation

所以,这是我的情景。我有一个名为URL的模型。 URL具有以下属性:link(必需),scheme(必需,但不是从链接解析safe.scheme)以及其他一些属性,这些属性不在此问题的上下文中

现在,我为该方案制作了一个自定义验证器,其中包括:

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.'));

    }
}

网址规则:

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

当遇到无效方案时,这样可以正常工作,例如让我们说ftp。

但是,当输入完全无效的网址时,scheme仍然为空,且validateScheme永远不会被触发,因为不需要属性scheme。为了验证,我调用了$model->validate()并且它返回true,即使它不应该(或者应该是,因为该属性不需要)。

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

然后我尝试了相反的方法,并使scheme成为必填字段。问题在于scheme字段不安全而且形式不存在。因此,URL不会保存,但不会显示错误。

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

P.S。我知道我可以在控制器中执行此操作。我不想那样做。我只想使用该模型。

2 个答案:

答案 0 :(得分:1)

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

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

查看更多here

答案 1 :(得分:0)

好的,在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']
    ];
}