代码之家  ›  专栏  ›  技术社区  ›  Masoud92m

yii2规则只起作用的使用场景

  •  3
  • Masoud92m  · 技术社区  · 6 年前

    我在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],
            ];
        }
    

    还有塞纳里奥的职责:

    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]);
    

    如果客人查看表单,只检查姓名和电子邮件,用户填写表单,没有字段检查! 为什么其他规则不检查?怎么解决?

    2 回复  |  直到 6 年前
        1
  •  4
  •   vishuB    6 年前

    参考 Yii2 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;
    }
    
        2
  •  2
  •   rob006    6 年前

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

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

    如果场景之间有许多“共享”属性,则可能不应重写此方法并在 rules() 只有。

    更多参见 scenarios documentation .