You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:37:17