Spatie Activity Log在第二外部数据库连接下日志不生效问题
问题原因
问题出在Event模型的两处错误配置,直接导致Spatie活动日志依赖的模型事件无法正常注册触发:
- 重写模型构造方法时未调用父类
Model的构造函数。LogsActivitytrait 是通过模型构造阶段注册created/updated/deleted等生命周期事件监听来实现日志自动记录的,覆盖构造方法且不执行parent::__construct()会直接跳过事件注册流程,日志逻辑完全不会执行。 - 数据库连接属性赋值错误。模型的
$connection属性需要接收数据库连接的名称字符串(即config/database.php里connections下的键名,比如external),当前代码将整个连接配置数组赋值给该属性,会导致模型连接解析异常,进一步影响事件监听的正常挂载。
可行修复方案
- 优先采用静态属性声明的方式配置外部数据库连接,完全避免重写构造方法带来的问题,修正后的
Event模型代码如下:
use Spatie\Activitylog\LogOptions; use Spatie\Activitylog\Traits\LogsActivity; use Illuminate\Database\Eloquent\Model; class Event extends Model { use LogsActivity; /** * 外部数据库连接名称,对应config/database.php中connections下的键名 * @var string */ protected $connection = 'external'; /** * 可批量赋值属性 * @var array */ protected $fillable = [ ... ]; /** * Spatie活动日志配置 * @return LogOptions */ public function getActivitylogOptions(): LogOptions { return LogOptions::defaults()->logFillable(); } }
- 若必须动态配置数据库连接,重写构造方法时必须调用父类构造方法,同时传入正确的属性参数,且
$connection赋值为连接名称字符串而非配置数组,示例代码如下:
public function __construct(array $attributes = []) { parent::__construct($attributes); $this->connection = 'external'; }
- 额外校验日志存储配置:Spatie活动日志默认使用项目默认数据库连接存储日志记录,如果需要将外部库模型的日志存储到外部数据库,需要先发布活动日志配置文件,将配置项中的
database_connection改为对应连接名,同时在对应连接的数据库中运行活动日志的迁移文件生成activity_log表。
内容的提问来源于stack exchange,提问作者Pathros
相关产品推荐
相关产品推荐

