所需验证器 (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.
所以,这是我的场景。我有一个名为 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.