Yii2 规则仅适用于使用场景

Yii2 rules work only use scenario

我在 Yii2 评论模型中写了两个场景,当用户登录或访客时。

我的规则是:

public function rules()
    {
        return [
            [['user_id'], 'required', 'on' => self::SCENARIO_USER],
            [['name', 'email'], 'required', 'on' => self::SCENARIO_GUEST],
            [['post_id', 'body', 'date'], 'required'],
            [['user_id', 'parent_id', 'post_id', 'status'], 'integer'],
            [['body'], 'string'],
            [['date'], 'safe'],
            [['name', 'email', 'site'], 'string', 'max' => 256],
        ];
    }

和 senarios 功能:

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_GUEST] = ['name' , 'email'];
    $scenarios[self::SCENARIO_USER] = ['user_id'];
    return $scenarios;
}

我是这样使用的:

$commentModel = Yii::$app->user->isGuest ? new Comment(['scenario' => Comment::SCENARIO_GUEST]) : new Comment(['scenario' => Comment::SCENARIO_USER]);

如果来宾查看表格,则仅检查姓名和电子邮件以及用户填写表格,不检查任何字段! 为什么其他规则不检查?如何解决?

参考Yii2 Scenarios

scenarios() 方法returns 一个数组,其键是场景名称,值是相应的活动属性。可以大量分配活动属性并接受验证。

public function scenarios()
{
     $scenarios = parent::scenarios();
     $scenarios[self::SCENARIO_GUEST] = ['name' , 'email', 'date', 'body', 'site', 'post_id'];
     $scenarios[self::SCENARIO_USER] = ['user_id', 'date', 'body', 'site', 'post_id'];
     return $scenarios;
}

如果您使用 scenarios(),您需要定义在给定场景中允许分配的所有属性。所以如果你想允许访客也编辑 bodydate 你需要这样的东西:

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_GUEST] = ['name' , 'email', 'body', 'date'];
    $scenarios[self::SCENARIO_USER] = ['user_id'];
    return $scenarios;
}

如果场景之间有许多 "shared" 属性,您可能不应该覆盖此方法并仅在 rules() 中定义它。

更多内容见scenarios documentation