所以,这是我的情景。我有一个名为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。我知道我可以在控制器中执行此操作。我不想那样做。我只想使用该模型。
答案 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']
];
}