记录laravel orm trait加载小技巧
因为某些时候需要在很多model里面加入一些保存前保存后的事件
比如
- 表
created_by
updated_by
字段自动维护
这种情况头一次想的是用 observer
或者直接监听 model 保存新增事件
机缘巧合下看到一篇文章 关于laravel orm加载trait的技巧 原文
实现方案
// app/Model/Traits/UserStamps
trait Usertamps{
public static function bootUserStamps()
{
static::creating(function (Model $model) {
// 设置 created_by 字段的值为当前登录的用户ID
$model->created_by = auth()->id();
});
static::updating(function (Model $model) {
// 设置 updated_by 字段的值为当前登录的用户ID
$model->updated_by = auth()->id();
});
}
}
这样只需要在用到的model直接use这个类即可。
大概语法是
initializeUserStamps
每次实例化新模型的时候都会调用bootUserStamps
这个应该是类似与 model::booted()里面执行
本作品采用《CC 协议》,转载必须注明作者和本文链接
高认可度评论:
实际业务场景里面不建议这样用,原因在于 auth() 是根据请求鉴权结果获取的数据,以下3种情况无法通过 auth() 获取授准确的权信息:
所以这样做并不能稳定获取授权信息,我们这样处理以上问题:
至于 trait 在模型方面的用法,确实有很多可发挥的余地,比如公共的模型关系:
类似的场景还比如有,是否关联品类 或 三级行政区 等等。
实际业务场景里面不建议这样用,原因在于 auth() 是根据请求鉴权结果获取的数据,以下3种情况无法通过 auth() 获取授准确的权信息:
所以这样做并不能稳定获取授权信息,我们这样处理以上问题:
至于 trait 在模型方面的用法,确实有很多可发挥的余地,比如公共的模型关系:
类似的场景还比如有,是否关联品类 或 三级行政区 等等。
其实创建时间和更新时间框架会自动维护的, 如果是字段和框架默认的 created_at 不同,那只需要在模型中修改 CREATED_AT 和 UPDATED_AT 的值即可。
并不实用,也不推荐这种做法trait 的作用是实现代码复用,而不是逻辑复用,created_by 字段还是推荐在控制器注入,observer也不适合这个例子,observer适合一些事件,比如创建用户同步创建用户扩展,修改用户同步修改用户扩展
挺好