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\TimestampBehavior
在 BaseActiveRecord::EVENT_BEFORE_INSERT
期间设置。此事件由 beforeSave()
回调调用。
如果您查看 ActiveRecord 中 insert()
方法的 souce code,您可以看到操作顺序是:
- 验证
- 保存前调用
- 插入
- 保存后调用
因此您的模型首先经过验证,然后设置 creation_time
。这就是此属性验证失败的原因。
如果您的 creation_time
仅由 TimestampBehavior
设置,则无需验证它。如果要允许编辑此属性,则可以使用 scenarios 仅在编辑期间验证它。
我有一个模型
[['creation_time'], 'integer']
具有
[
'class' => TimestampBehavior::className(),
'createdAtAttribute' => 'creation_time'
]
已分配行为。
如果我将此属性标记为 required
,它将无法通过模型验证,就好像它丢失了一样。
为什么?
如何将其标记为必需?
问题在于执行操作的顺序。
creation_time
属性由 yii\behaviors\TimestampBehavior
在 BaseActiveRecord::EVENT_BEFORE_INSERT
期间设置。此事件由 beforeSave()
回调调用。
如果您查看 ActiveRecord 中 insert()
方法的 souce code,您可以看到操作顺序是:
- 验证
- 保存前调用
- 插入
- 保存后调用
因此您的模型首先经过验证,然后设置 creation_time
。这就是此属性验证失败的原因。
如果您的 creation_time
仅由 TimestampBehavior
设置,则无需验证它。如果要允许编辑此属性,则可以使用 scenarios 仅在编辑期间验证它。