3

我有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';
    .
    .
    .
}

现在我想要一个根本不应该有任何验证的场景三。我将在代码中进行额外的检查,以防止在数据库中存储时失败。我只需要确保没有应用任何验证,因为它会阻止我的表单提交。如果我不应用任何方案,则应用默认方案(所有列出的验证都将处于活动状态,这与我需要的方案完全相反)。

4

2 回答 2

4

如果我正确理解了您的问题,您可以指定scenario_three为当前场景:模型将找不到匹配的规则并跳过验证检查。

public function actionThree($id)
{           
    $modelMyEntity = $this->findModel($id);
    $modelMyEntity->scenario = 'scenario_three';
    .
    .
    .
}

UPD: 但是我强烈建议明确定义所有场景和相应的活动属性(在scenario方法中)和 remove $scenarios = parent::scenarios();,因为它可能会导致不必要的影响。父实现主要是为了向后兼容 Yii1 而开发的,没有scenarios()方法。并且通常假设如果您覆盖scenarios()方法,则不应将显式定义的场景与父实现合并。

于 2016-09-25T18:17:27.267 回答
4

为了能够做到这一点,您需要做一些事情(包括您几乎自己做的事情):

  • 在你的控制器中,写$modelMyEntity->scenario = 'scenario_three';

  • 在模型中,在方法中添加一个额外的场景数组“scenario_three” scenarios()

像这样:

$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'],

对于如何忽略规则,这是一个有点不同的解决方案,但我发现这更有吸引力,因为将来为这种情况添加/删除特定属性会更容易,并且其他开发人员也更容易(如果不仅仅是你)了解您要做什么。

但我认为@iStranger 的解决方案也有效(简单得多)。

于 2016-09-25T18:21:00.653 回答