Gedmo Loggable未写入ext_log_entries表问题求助
排查Gedmo Loggable未生成变更日志的问题
看起来你已经配置了实体注解和基础的Doctrine映射,但日志没写入ext_log_entries表,我帮你梳理几个可能遗漏的关键点,你可以逐一排查:
- 确保Loggable监听器已注册
Gedmo的扩展依赖Doctrine事件监听器来触发日志记录逻辑。如果是Symfony项目,你需要确认Gedmo\Loggable\LoggableListener已经被注册到Doctrine的事件管理器中。
如果使用StofDoctrineExtensionsBundle,只需在config/packages/stof_doctrine_extensions.yaml中启用Loggable:
stof_doctrine_extensions: default_locale: en_US orm: default: loggable: true
如果是手动注册,要在services.yaml里添加监听器配置:
services: Gedmo\Loggable\LoggableListener: tags: - { name: doctrine.event_subscriber, connection: default } calls: - [setAnnotationReader, ['@annotation_reader']]
- 实体类缺少@Entity注解
你的MyClass没有标注Doctrine的@Entity注解,这会导致Doctrine无法识别它为实体,Gedmo的注解自然也不会生效。补上这个注解:
/** * @Entity * @Gedmo\Loggable * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false) */ class MyClass { // ... 其他字段和方法 }
- 确保字段可被访问
你定义的$type是private字段,Gedmo需要读取和修改这个字段的值来生成版本日志。要么给它添加public的getter/setter方法,要么把字段改为protected(Doctrine的映射默认支持protected字段的访问):
/** * @Gedmo\Versioned */ private $type; // 添加getter和setter public function getType() { return $this->type; } public function setType($type) { $this->type = $type; }
- 确认ext_log_entries表已创建
如果是首次使用Loggable,需要生成对应的数据库表。运行Doctrine的schema更新命令来创建表:
php bin/console doctrine:schema:update --force
或者用迁移工具生成并执行迁移文件,确保表结构正确。
- 检查EntityManager的flush操作
Loggable的日志是在EntityManager::flush()时触发的,如果你更新实体后没有调用flush(),或者操作不在Doctrine的生命周期内,日志不会被写入。确保你的更新逻辑是这样的:
$entity = $em->find(MyClass::class, $id); $entity->setType('new-type'); $em->flush(); // 这一步才会触发日志记录
内容的提问来源于stack exchange,提问作者Thibault Dumas
相关产品推荐
相关产品推荐

