所需的YII验证规则-所需规则的工作方式

sqxo8psd  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(132)

我从Yii开始,我不明白模型规则中的必需规则何时或如何工作。
我有一个文章表,列标题,slug,正文,created_at

slugcreated_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',
        ]
    ];
}
34gzjxbg

34gzjxbg1#

SluggableBehaviorTimestampBehavior正在使用不同的事件:

  1. SluggableBehavior正在使用ActiveRecord::EVENT_BEFORE_VALIDATE,因此slug是在验证之前生成,因此required规则不会抱怨缺少slug,因为它不再为空
  2. TimestampBehavior正在使用ActiveRecord::EVENT_BEFORE_INSERTActiveRecord::EVENT_BEFORE_UPDATE事件,这些事件在验证后执行,因此在验证时,带日期的字段为空。

相关问题