我在Yii2中有一个控制器,它将ActiveController扩展为RESTful,我可以使用PUT方法更新它。但是我想将一些属性设置为不安全,因为我不希望它们可以更新。
阅读一些不同的例子我认为我可以在模型的规则中做这样的事情:
[['first_name','last_name','!password'], 'safe', 'on' => 'update'],
但是,这并不能防止更新密码。
然后我找到了scenario()方法,并认为这应该有效:
public function scenarios()
{
return [
'default' => ['*'], // Also tried without this line
'update' => ['first_name','last_name','!password'],
];
}
但这会阻止所有属性更新。
有没有人有任何其他建议?
答案 0 :(得分:2)
这条规则只是意味着可以大规模地分配属性(使用Model::load()),但是没有任何验证,也可以在每个场景中。
[['first_name','last_name','password'], 'safe'],
但你也可以在这里使用,例如'string'而不是'safe'。然后它也用于每个场景,但现在使用字符串验证。
通过以下内容,您将介绍一个“更新”方案,并告诉Validation引擎first_name和last_name应该可以大规模分配并进行验证,但不包括密码。就像你预期的那样。
public function scenarios()
{
return [
'update' => ['first_name','last_name','!password'],
];
}
重要的是,您在调用load()或save()之前在更新或创建(在控制器中)设置方案:
$model = ...
$model->scenario = 'update';
$model->load(...);
$model->save();