我从Yii开始,我不明白模型规则中的必需规则何时或如何工作。
我有一个文章表,列标题,slug,正文,created_at。
slug和created_at列是在php中生成的,所以它们不是必需的,也不是create form的一部分。如果我把created_at留在必需的规则中,它会抛出一个错误,原因是缺少值。但是如果我把slug留在必需的规则中,它不会抛出错误,它会工作。但是slug没有值,原因是它是稍后在Php中生成的。
因此,问题是是否在POST数据上验证所需的规则,或者在将其插入到DB时验证所需的规则,或者......?下面是包含规则和行为的模型代码:
public function rules()
{
return [
//[['title', 'created_at', 'body'], 'required'], // THIS THROWS AN ERROR cause created_at is not in POST
[['title', 'slug', 'body'], 'required'], // THIS SHOULD THROW AN ERROR cause slug is not in POST but it works. Why?
[['body'], 'string'],
[['created_at', 'updated_at', 'created_by'], 'integer'],
[['title', 'slug'], 'string', 'max' => 100],
[['created_by'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['created_by' => 'id']],
];
}
public function behaviors()
{
return [
TimestampBehavior::class,
[
'class' => BlameableBehavior::class,
'updatedByAttribute' => FALSE,
],
[
'class' => SluggableBehavior::class,
'attribute' => 'title',
]
];
}
1条答案
按热度按时间34gzjxbg1#
SluggableBehavior
和TimestampBehavior
正在使用不同的事件:SluggableBehavior
正在使用ActiveRecord::EVENT_BEFORE_VALIDATE
,因此slug是在验证之前生成,因此required
规则不会抱怨缺少slug,因为它不再为空TimestampBehavior
正在使用ActiveRecord::EVENT_BEFORE_INSERT
和ActiveRecord::EVENT_BEFORE_UPDATE
事件,这些事件在验证后执行,因此在验证时,带日期的字段为空。