1

所以,这是我的场景。我有一个名为 URL 的模型。URL 具有以下属性:(link必需),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。

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

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

然后我尝试了另一种方式,并制作scheme了一个必填字段。问题在于scheme字段不安全且表单中不存在这一事实。因此,URL 不会保存,但不会显示错误。

我的问题 1,在这种情况下是:有没有办法分配targetAttributescheme以便错误消息如下所示link

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

4

2 回答 2

1

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

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

在这里查看更多。

于 2016-02-07T16:40:16.377 回答
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']
    ];
}
于 2016-02-07T16:31:41.510 回答