我今天遇到了一个相当奇怪的问题。
我用这些规则建立了一个模型:
public function rules()
{
return [
[['name', 'email', 'website'], 'required'],
[['name'], 'string', 'max' => 512],
[['name'], 'unique'],
[['email'], 'email'],
[['website'], 'url'],
];
}
当通过控制器访问时,这将相应地工作。但是我的单位
验证电子邮件时测试失败:
$model->email = 'somethinghan.nl';
$this->assertFalse($model->validate('email'),
'Email is invalid.');
$model->email = '[email protected]';
$this->assertTrue($model->validate('email'),
'Validating email with a valid email: ' . $model->email);
我在表单中使用了同一封电子邮件,其中的数据被允许进入数据库。但在这里使用时,IS在第二次电子邮件验证时失败。
我尝试过其他电子邮件格式,但这也解决不了问题。有什么想法吗?
最佳答案
如果您使用getErrors()
转储错误,您将看到失败的不是电子邮件验证。
它不起作用的原因是,您没有将要验证的属性指定为数组:
如果您查看Validator
-code(这里的validate()
-调用最终结束):
public function validateAttributes($model, $attributes = null)
{
if (is_array($attributes)) {
$attributes = array_intersect($this->attributes, $attributes);
} else {
$attributes = $this->attributes;
}
...
}
所以基本上:如果它不是一个数组,它会被抛出,所以它会验证所有属性。
将其更改为
$this->assertFalse($model->validate(['email']), 'Email is invalid.');
,它应该可以工作编辑:顺便说一下,这是一个很容易犯的错误,因为框架在很多其他地方确实将单个字符串转换为数组。所以这种行为并不完全一致。