我正在使用不同的场景进行验证。
在方案中不需要字段电子邮件,但如果我传递电子邮件,则不会将其保存在数据库中。
模型中的规则:
[['firstname','email'], 'string', 'max' => 256],
场景功能
public function scenarios() {
$scenarios = parent::scenarios();
$scenarios['insert2'] = ['firstname', 'status'];
return $scenarios;
}
在控制器中:
$model = new User();
$model->scenario = "insert2";
$model->load($data);
print_r($model);
Print_r返回空白
的电子邮件答案 0 :(得分:5)
请注意,正在填充的数据受setAttributes()的安全检查。
现在,setAttributes()签名:
public void setAttributes ( $values, $safeOnly = true )
其中$safeOnly
设置为true
表示只应对安全属性进行分配。安全属性是与当前$方案中的验证规则相关联的属性。
因此情景中必须包含email
。
答案 1 :(得分:1)
在Yii2中,当您希望在某些方案中应用规则时,您可以指定规则的on属性,如下所示
public function rules()
{
return [
//rule applied only in scenario 'insert2'
[['first_name','status'], 'required','on' => 'insert2'],
//rule applied in all scenarios
['email','safe'],
//rule applied only in scenario 'insert3'
[['first_name','status','email'], 'required','on' => 'insert3'],
];
}
现在,如果您在控制器中指定$model->scenario = "insert2"
,那么 first_name和状态是必需的,如果您提供任何值,则会发送电子邮件,因为['email','safe']
规则也适用于此处。
如果您在控制器中指定$model->scenario = "insert3"
,则 first_name,状态和电子邮件现在是必填字段,并且规则['email','safe']
也会被应用。
请注意,您不能在此使用public function scenarios() {..
来自http://www.yiiframework.com/doc-2.0/guide-structure-models.html#validation-rules