Validation 如何在Yii2中创建没有激活验证规则的场景?

Validation 如何在Yii2中创建没有激活验证规则的场景?,validation,yii2,scenarios,validationrules,yii-validation,Validation,Yii2,Scenarios,Validationrules,Yii Validation,我有MyEntity.php模型。作为模型脚本的一部分,定义了一些规则和一些场景: public function rules() { return [ [['myentity_id', 'myentity_title', 'myentity_content', 'myentity_date'], 'required'], [['myentity_id'], 'integer'], [['myentity_title', 'myentity

我有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;
}
我需要能够有不同的场景,对于不同的操作,只有某些验证(通过参数)处于活动状态。例如,场景1代表动作1,场景2代表动作2等

以下是来自控制器的一小部分代码:

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

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

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

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

public function actionThree($id)
{           
    $modelMyEntity = $this->findModel($id);
    $modelMyEntity->scenario = 'scenario_three';
    .
    .
    .
}
UPD:
但是,我严格建议明确定义所有场景和相应的活动属性(在
场景
方法中),并删除
$scenarios=parent::scenarios(),因为它会造成不必要的影响。父实现主要是为了与Yii1向后兼容而开发的,Yii1没有
scenarios()
方法。通常假设,如果重写
scenarios()
方法,则不应将显式定义的场景与父实现合并

要做到这一点,你需要做一些事情(包括你自己几乎做过的事情):

  • 在控制器中,编写
    $modelmeyentity->scenario='scenario_三'

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

像这样:

  • 最后,
    rules()
    中需要进行大多数更改,因为您需要添加包含或排除特定场景的位置
基本上,您现在可以在每个规则中编写
,除了
条件之外,并指出哪些属性将不符合哪个场景。因此,在您的示例中,让我们排除
场景三的所有属性:

[['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的解决方案太简单了。

我也喜欢这个,它非常简单,易于理解。:)这里有一个向上的投票。@EdvinTenovimas谢谢)@IStranger,你能不能也发一段代码,这个描述在实践中应该是什么样子的(从我最初的问题来看,“rules()”和“scenarios()”函数应该做些什么更改)?我喜欢except的用法conditional@KiranMuralee谢谢你的支持!我希望其他人会觉得这很有用。这个解决方案更好一点,因为如果您对jQuery进行更多更改,像这样的jQuery仍然会显示验证(绿色字段)。@Edvin Tenovimas是Yi2指南中的信息。我搜索了它,但找不到。但是我找到了“on”的用法。例如//username,电子邮件和密码在“注册”场景中都是必需的[['username','email','password'],'required','on'=>self::scenario\u register],@KiranMuralee如果您愿意,我可以提供关于这些场景的非常详细的信息。但最好使用电子邮件或类似的方式,因为解释会比注释所允许的符号占用更多的空间。:)简而言之,我相信至少有一个例子是
,除了
,但不确定,没有检查。
[['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'],