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]);
如果来宾查看表格,则仅检查姓名和电子邮件以及用户填写表格,不检查任何字段!
为什么其他规则不检查?如何解决?
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()
,您需要定义在给定场景中允许分配的所有属性。所以如果你想允许访客也编辑 body
和 date
你需要这样的东西:
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。
我在 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]);
如果来宾查看表格,则仅检查姓名和电子邮件以及用户填写表格,不检查任何字段! 为什么其他规则不检查?如何解决?
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()
,您需要定义在给定场景中允许分配的所有属性。所以如果你想允许访客也编辑 body
和 date
你需要这样的东西:
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。