【问题标题】:Yii2 - Set safe attributes on scenariosYii2 - 在场景中设置安全属性
【发布时间】:2018-01-11 18:03:17
【问题描述】:

当我使用场景(在我的示例“更新”场景中)时,如何保护我的属性以进行大规模分配?

这是我的规则:

public function rules()
{
    return [
        [['user_id', 'type', 'name', 'status'], 'required'],
        [['country_id', 'address', 'name', 'status'], 'safe', 'on' => 'update'],
    ];
}

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios['update'] = ['user_id', 'type', 'name'];
    return $scenarios;
}

当我使用 $model->safeAttributes() 检查控制器中的安全属性时,我只获得了函数场景() 的“更新”场景所需的属性。

当然,$model->load(Yii::$app->request->post()) 函数不会检索其他属性。

我怎样才能保证它们的安全? 就算想加点别的规则,也找不到路!

【问题讨论】:

  • 你是在打电话给$model->safeAttributes()之前设置场景吗
  • 是的,我在 findModel 函数之后定义场景,如下所示:public function actionUpdate($id){$model = $this->findModel($id);$model->scenario = 'CU';

标签: yii yii2 attributes scenarios


【解决方案1】:

您需要将它们全部添加到场景中

$scenarios['update'] = ['user_id', 'type', 'name', 'country_id', 'address', 'name', 'status'];

【讨论】:

  • 如果我要这样做,这意味着所有这些字段都是必需的。但我不想那样。
  • @SamirIZZA 不,这意味着所有这些字段都是安全的,可以大量分配。您在规则中配置的必填字段。
  • 天哪,你是对的!我不知道我是怎么理解的。我一直认为这样我们声明了必填字段而不是活动字段。但是我错了。感谢您的帮助!
  • @SamirIZZA 我很乐意提供帮助。
【解决方案2】:

在加载模型之前设置场景:

$model->setScenario('update');
$model->load(Yii::$app->request->post())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多