Yii2新手求助:如何让插入验证规则同步作用于更新操作?
解决Yii2中插入验证规则同步到更新操作的问题
嘿,别担心,我来帮你理清楚Yii2验证规则和场景的用法~
首先得纠正一个小误解:Yii2中,没有指定on属性的验证规则,默认会在所有场景生效,包括insert(插入)和update(更新)。所以你现在写的规则其实已经会在更新操作中生效了!
你之前尝试添加'on' => 'update'反而会让这条规则只在更新场景生效,插入场景时反而不验证了,这显然不是你想要的效果。
正确的处理方式分两种情况:
让所有规则在插入和更新时都生效(这正是你需要的)
直接保留你原来的规则即可,不需要加任何on属性。默认情况下,这些规则会自动覆盖insert和update场景:public $tag; public function rules() { return [ [['user_id', 'name', 'address', 'state'], 'required'], [['user_id'], 'integer'], [['tag'], 'safe'], [['name'], 'string', 'max' => 30], [['address'], 'string', 'max' => 250], [['state'], 'string', 'max' => 255], ]; }如果需要明确指定规则生效的场景(比如防止其他自定义场景干扰)
如果你想明确声明这些规则只在insert和update场景生效,可以给规则加上on属性并传入场景数组:public function rules() { return [ [['user_id', 'name', 'address', 'state'], 'required', 'on' => ['insert', 'update']], [['user_id'], 'integer', 'on' => ['insert', 'update']], [['tag'], 'safe', 'on' => ['insert', 'update']], [['name'], 'string', 'max' => 30, 'on' => ['insert', 'update']], [['address'], 'string', 'max' => 250, 'on' => ['insert', 'update']], [['state'], 'string', 'max' => 255, 'on' => ['insert', 'update']], ]; }不过这种写法有点冗余,因为默认行为就是这样,所以第一种方式更简洁。
额外检查点:
确保你在控制器的更新方法中,没有手动修改模型的场景。比如下面是标准的更新方法写法,这样会自动使用update场景并触发验证:
public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('update', [ 'model' => $model, ]); }
如果你的代码里有类似$model->scenario = 'custom_scenario'这样的语句,会导致验证规则只应用到自定义场景,这时候就需要调整场景设置啦。
内容的提问来源于stack exchange,提问作者Zoe
相关产品推荐
相关产品推荐

