Yii2规则仅适用于使用场景

Yii2规则仅适用于使用场景,yii2,yii2-basic-app,scenarios,Yii2,Yii2 Basic App,Scenarios,我在Yii2评论模型中编写了两个场景,当用户登录或是来宾时 我的规则是: public function rules() { return [ [['user_id'], 'required', 'on' => self::SCENARIO_USER], [['name', 'email'], 'required', 'on' => self::SCENARIO_GUEST], [['po

我在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 Function:

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]);
如果客人查看表单,只检查姓名和电子邮件,用户填写表单,不检查字段! 为什么其他规则不检查?如何修复它?

请参阅

scenarios()方法返回一个数组,其键是对应活动属性的方案名称和值。可以大量指定活动属性,并对其进行验证

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;
}
如果使用,则需要定义在给定场景中允许分配的所有属性。因此,如果您希望允许来宾同时编辑
正文
日期
,您需要如下内容:

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_GUEST] = ['name' , 'email', 'body', 'date'];
    $scenarios[self::SCENARIO_USER] = ['user_id'];
    return $scenarios;
}
如果场景之间有许多“共享”属性,则可能不应重写此方法,而仅在
rules()
中定义它


有关更多信息,请参见。

另一个提示,如果您有5个以上的属性,则可以获取所有属性并仅删除匹配的属性。假设您想在特定场景中排除一个属性,而不是为了排除单个属性而列出10个属性,您可以
array_diff(array_flip($this->attributes),['excludedAttribute1','excludedAttribute2'])
,我在手机上,但是我认为您需要翻转$this->attributes,因为键持有属性名称和值持有属性值,无论模型的属性是否被赋值。