【问题标题】:How to override/extend default Doctrine EntityManager class in Symfony2? [duplicate]如何在 Symfony2 中覆盖/扩展默认的 Doctrine EntityManager 类? [复制]
【发布时间】:2013-10-24 20:11:49
【问题描述】:

我创建了一些额外的方法来帮助管理 Symfony2 项目中的实体。我希望这些方法可以在 Doctrine 的 EntityManager 上使用,它是从具有“doctrine.orm.entity_manager”键的容器中获取的。

我找到了this post,并尝试实现它,但它不起作用。我收到一条错误消息,上面写着The attribute "name" must be set for path "doctrine.orm.entity_managers".

这是一篇较旧的帖子,因此它可能是某种从那时起已被弃用的“技巧”;我正在使用 Symfony2 和 Doctrine 的最新稳定版本。

有没有办法覆盖 Doctrine 用来创建它的默认 EntityManager 的类,还是我必须像另一个服务一样创建并使用它?

【问题讨论】:

  • 你这样做有什么意义?
  • 我刚刚添加了一些辅助方法,例如处理更大的实体组以持久化。例如,我有一个方法,它接受多个实体,将它们持久化,然后在操作结束时运行刷新。它们不是大的变化,而是在我开始构建其他东西时可以节省时间的小东西。
  • 您为什么不创建另一个以EntityManager 作为构造函数参数的类,并处理您需要的方法呢?
  • 这是可能的,但最方便的是覆盖,真正扩展,无论 Doctrine 使用什么类。这样,某人只需获得“doctrine.orm.entity_manager”服务并可以访问这些附加方法,而不必使用其他类或服务来完成。

标签: symfony orm doctrine extend entitymanager


【解决方案1】:

方式保持不变。

使用扩展 Doctrine\ORM\EntityManager 的自定义 EntityManager 类从 services.yml 中的 orm.xml 覆盖参数 doctrine.orm.entity_manager.class

覆盖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 中为教义设置了错误的设置。见reference

【讨论】:

  • 我在页面中没有看到对“doctrine.orm.entity_manager.class”配置项的任何引用。我注意到该示例显示了多个实体管理器定义,但我也没有在它们下看到“类”设置。
  • 只是参数中的一个字符串,见orm.xml
猜你喜欢
  • 2017-06-28
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多