如何在没有激活验证规则的情况下在 Yii2 中创建场景?
How to create scenario in Yii2 with no validation rules active?
我有 MyEntity.php 模型。作为模型脚本的一部分,定义了一些规则和一些场景:
public function rules()
{
return [
[['myentity_id', 'myentity_title', 'myentity_content', 'myentity_date'], 'required'],
[['myentity_id'], 'integer'],
[['myentity_title', 'myentity_content'], 'string', 'max' => 120],
[['myentity_date'], 'safe'],
];
}
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios['scenario_one'] = ['myentity_id', 'myentity_title'];
$scenarios['scenario_two'] = ['myentity_id', 'myentity_content'];
return $scenarios;
}
我需要能够有不同的场景,并且对于不同的操作,只有某些验证(通过参数)处于活动状态。例如,scenario_one 用于 actionOne,scenario_two 用于 actionTwo 等
下面是来自控制器的一小部分代码:
public function actionOne($id)
{
$modelMyEntity = $this->findModel($id);
$modelMyEntity->scenario = 'scenario_one';
.
.
.
}
public function actionTwo($id)
{
$modelMyEntity = $this->findModel($id);
$modelMyEntity->scenario = 'scenario_two';
.
.
.
}
现在我想要一个 scenario_three 根本不应该有任何验证的地方。 我将在代码中进行额外的检查,以防止在存储时失败在数据库中。我只需要确保没有应用任何验证,因为它会阻止我的表单提交。如果我不应用任何场景,则应用默认场景(所有列出的验证都将处于活动状态,这与我需要的场景完全相反)。
如果我正确理解了你的问题,你可以指定 scenario_three
作为当前场景:模型将找不到匹配的规则并将跳过验证检查。
public function actionThree($id)
{
$modelMyEntity = $this->findModel($id);
$modelMyEntity->scenario = 'scenario_three';
.
.
.
}
更新:
但是,我强烈建议明确定义所有场景和相应的活动属性(在 scenario
方法中)并删除 $scenarios = parent::scenarios();
,因为它会导致不必要的影响。父实现主要是为了与 Yii1 向后兼容而开发的,没有 scenarios()
方法。并且通常假定如果您覆盖 scenarios()
方法,则不应将您明确定义的场景与父实现合并。
为了能够做到这一点,您需要做一些事情(包括您自己几乎完成的事情):
在你的控制器中,写$modelMyEntity->scenario = 'scenario_three';
在模型中,在scenarios()
方法中添加一个额外的场景数组'scenario_three':
像这样:
$scenarios['scenario_three'] = ['myentity_id', 'myentity_content'];
- 最后,
rules()
中需要进行大部分更改,因为您需要添加包含或排除特定场景的位置。
基本上,您现在可以在每个规则中编写 except
条件并指出哪些属性不符合哪些场景。因此,在您的示例中,让我们排除 scenario_three
:
的所有属性
[['myentity_id', 'myentity_title', 'myentity_content', 'myentity_date'], 'required', 'except' => 'scenario_three'],
[['myentity_id'], 'integer', 'except' => 'scenario_three'],
[['myentity_title', 'myentity_content'], 'string', 'max' => 120, 'except' => 'scenario_three'],
[['myentity_date'], 'safe'],
对于如何忽略规则,这是一个略有不同的解决方案,但我发现它更有吸引力,因为将来可以更容易 add/remove 这种情况下的特定属性,并且对其他开发人员来说也更容易(如果不仅仅是你) 了解你正在尝试做什么。
但我认为@iStranger 的解决方案也有效(更简单)。
我有 MyEntity.php 模型。作为模型脚本的一部分,定义了一些规则和一些场景:
public function rules()
{
return [
[['myentity_id', 'myentity_title', 'myentity_content', 'myentity_date'], 'required'],
[['myentity_id'], 'integer'],
[['myentity_title', 'myentity_content'], 'string', 'max' => 120],
[['myentity_date'], 'safe'],
];
}
public function scenarios()
{
$scenarios = parent::scenarios();
$scenarios['scenario_one'] = ['myentity_id', 'myentity_title'];
$scenarios['scenario_two'] = ['myentity_id', 'myentity_content'];
return $scenarios;
}
我需要能够有不同的场景,并且对于不同的操作,只有某些验证(通过参数)处于活动状态。例如,scenario_one 用于 actionOne,scenario_two 用于 actionTwo 等
下面是来自控制器的一小部分代码:
public function actionOne($id)
{
$modelMyEntity = $this->findModel($id);
$modelMyEntity->scenario = 'scenario_one';
.
.
.
}
public function actionTwo($id)
{
$modelMyEntity = $this->findModel($id);
$modelMyEntity->scenario = 'scenario_two';
.
.
.
}
现在我想要一个 scenario_three 根本不应该有任何验证的地方。 我将在代码中进行额外的检查,以防止在存储时失败在数据库中。我只需要确保没有应用任何验证,因为它会阻止我的表单提交。如果我不应用任何场景,则应用默认场景(所有列出的验证都将处于活动状态,这与我需要的场景完全相反)。
如果我正确理解了你的问题,你可以指定 scenario_three
作为当前场景:模型将找不到匹配的规则并将跳过验证检查。
public function actionThree($id)
{
$modelMyEntity = $this->findModel($id);
$modelMyEntity->scenario = 'scenario_three';
.
.
.
}
更新:
但是,我强烈建议明确定义所有场景和相应的活动属性(在 scenario
方法中)并删除 $scenarios = parent::scenarios();
,因为它会导致不必要的影响。父实现主要是为了与 Yii1 向后兼容而开发的,没有 scenarios()
方法。并且通常假定如果您覆盖 scenarios()
方法,则不应将您明确定义的场景与父实现合并。
为了能够做到这一点,您需要做一些事情(包括您自己几乎完成的事情):
在你的控制器中,写
$modelMyEntity->scenario = 'scenario_three';
在模型中,在
scenarios()
方法中添加一个额外的场景数组'scenario_three':
像这样:
$scenarios['scenario_three'] = ['myentity_id', 'myentity_content'];
- 最后,
rules()
中需要进行大部分更改,因为您需要添加包含或排除特定场景的位置。
基本上,您现在可以在每个规则中编写 except
条件并指出哪些属性不符合哪些场景。因此,在您的示例中,让我们排除 scenario_three
:
[['myentity_id', 'myentity_title', 'myentity_content', 'myentity_date'], 'required', 'except' => 'scenario_three'],
[['myentity_id'], 'integer', 'except' => 'scenario_three'],
[['myentity_title', 'myentity_content'], 'string', 'max' => 120, 'except' => 'scenario_three'],
[['myentity_date'], 'safe'],
对于如何忽略规则,这是一个略有不同的解决方案,但我发现它更有吸引力,因为将来可以更容易 add/remove 这种情况下的特定属性,并且对其他开发人员来说也更容易(如果不仅仅是你) 了解你正在尝试做什么。
但我认为@iStranger 的解决方案也有效(更简单)。