事件(Behavior Hooks)
大约 1 分钟
事件(Behavior Hooks)
通过 ActiveModelBehavior
可以在持久化生命周期内挂钩,典型用途:
- 自动时间戳、默认值
- 规范化(去空格、大小写)与业务校验
- 保存/删除前做约束检查
- 保存后触发内部事件总线(解耦通知/缓存)
生命周期钩子
use sea_orm::{ActiveModelBehavior, DbErr, ActiveValue::Set};
impl ActiveModelBehavior for entity::sys_user::ActiveModel {
fn before_save(mut self, insert: bool) -> Result<Self, DbErr> {
let now = chrono::Utc::now();
if insert { if self.created_at.is_not_set() { self.created_at = Set(now); } }
self.updated_at = Set(now);
if let Set(ref mut name) = self.username { *name = name.trim().to_string(); }
Ok(self)
}
fn after_save(self, _insert: bool) -> Result<Self, DbErr> {
// 触发事件总线(示例)
// state.events.publish(Event::UserCreated{...}); // 注意:Behavior 中拿不到 state,建议在 Service 层做
Ok(self)
}
fn before_delete(self) -> Result<Self, DbErr> {
// 可做约束检查(如管理员账号禁止删除)
Ok(self)
}
}
注意
- Behavior 里没有 AppState,上下文依赖建议在 Service 层完成
- 严重业务校验(跨表/外部服务)不建议放在 Behavior 内
与服务层事件的配合
- 保存成功后在 Service 层发布领域事件(见“深入/事件”)
- 将“副作用”(缓存刷新、通知)移至监听器,保持写路径简单可测