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

时间:2013-10-16 15:53:50

标签: symfony orm doctrine extend entitymanager

我已经创建了一些其他方法来帮助管理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的类,或者我是否必须像其他服务一样创建并使用它?

1 个答案:

答案 0 :(得分:3)

方式保持不变。

使用扩展orm.xml的自定义EntityManager类,覆盖services.yml中Doctrine\ORM\EntityManager的参数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中为doctrine设置了错误的设置。请参阅reference