Yii2,当行为分配该属性时,为什么模型验证由于缺少强制属性而失败?

Yii2, why a model validation fails due to a missing mandatory attribute when that attribute is assigned by a Behavior?

我有一个模型
[['creation_time'], 'integer'] 具有

的属性
[
    'class' => TimestampBehavior::className(),
    'createdAtAttribute' => 'creation_time'
]

已分配行为。
如果我将此属性标记为 required,它将无法通过模型验证,就好像它丢失了一样。
为什么?
如何将其标记为必需?

问题在于执行操作的顺序。

creation_time 属性由 yii\behaviors\TimestampBehaviorBaseActiveRecord::EVENT_BEFORE_INSERT 期间设置。此事件由 beforeSave() 回调调用。

如果您查看 ActiveRecord 中 insert() 方法的 souce code,您可以看到操作顺序是:

  1. 验证
  2. 保存前调用
  3. 插入
  4. 保存后调用

因此您的模型首先经过验证,然后设置 creation_time。这就是此属性验证失败的原因。

如果您的 creation_time 仅由 TimestampBehavior 设置,则无需验证它。如果要允许编辑此属性,则可以使用 scenarios 仅在编辑期间验证它。