如何在Symfony2中覆盖/扩展默认的Doctrine EntityManager类?

3
我已经创建了一些额外的方法来帮助管理Symfony2项目中的实体。我希望这些方法可以在Doctrine的EntityManager上使用,该实体管理器通过“doctrine.orm.entity_manager”键从容器中获取。
我找到了这篇文章,并尝试实现它,但它没有起作用。我收到一个错误消息,说“必须为路径“doctrine.orm.entity_managers”设置属性“name”。
这是一篇较旧的文章,因此可能是一种已被弃用的“技巧”;我正在使用最新稳定版本的Symfony2和Doctrine。
是否有一种覆盖Doctrine用于创建其默认EntityManager的类的方法,或者我只需要创建另一个服务并使用它?

你为什么要做这件事情? - Touki
我刚刚添加了一些辅助方法,用于处理更大的实体组以进行持久化。例如,我有一个方法,它接受多个实体,将它们持久化,然后在操作结束时运行flush。这些不是很大的改变,但对我构建其他东西时会节省时间的小事情。 - jzimmerman2011
1
为什么不创建另一个类,将 EntityManager 作为构造函数参数,并处理您需要的方法呢? - Touki
这是可能的,但最方便的方法是覆盖(实际上扩展)Doctrine使用的任何类。这样,某人只需获取“doctrine.orm.entity_manager”服务即可访问这些额外方法,而不必使用另一个类或服务来执行此操作。 - jzimmerman2011
1个回答

2

路线仍保持不变。

在您的services.yml中使用自定义的EntityManager类覆盖参数doctrine.orm.entity_manager.class,该类应扩展Doctrine\ORM\EntityManager,并覆盖orm.xml中的设置。

覆盖create方法(它有些变化)

public static function create($conn, Configuration $config, EventManager $eventManager = null)
{
    if ( ! $config->getMetadataDriverImpl()) {
        throw ORMException::missingMappingDriverImpl();
    }

    switch (true) {
        case (is_array($conn)):
            $conn = \Doctrine\DBAL\DriverManager::getConnection(
                $conn, $config, ($eventManager ?: new EventManager())
            );
            break;

        case ($conn instanceof Connection):
            if ($eventManager !== null && $conn->getEventManager() !== $eventManager) {
                 throw ORMException::mismatchedEventManager();
            }
            break;

        default:
            throw new \InvalidArgumentException("Invalid argument: " . $conn);
    }

    // return your instance of em
    return new MyEntityManager($conn, $config, $conn->getEventManager());
}

你看到的错误是因为在config.yml文件中的doctrine设置有误。请参考reference

1
我在页面上没有看到关于“doctrine.orm.entity_manager.class”配置项的任何参考。我注意到示例显示了多个实体管理器定义,但是我也没有在它们下面看到“class”设置。 - jzimmerman2011
这只是参数中的一个字符串,请参见orm.xml - Alexey B.
请查看此链接:http://forum.symfony-project.org/forum/23/topic/36727.html - Chirag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接