有没有办法在Symfony2中指定Doctrine2 Entitymanager实现类?

Yoa*_*net 6 configuration symfony doctrine-orm

我目前正在使用Symfony2和Doctrine2,但我必须覆盖Doctrine2 EntityManager并添加一些"取消删除"功能(内部的ACL).

所以我想知道:有没有办法覆盖EntityManager类并在Symfony2中指定Doctrine2以将其用作EntityManager的实现?

感谢您的任何帮助!

小智 20

在Doctrine 2.4(Doctrine 2.4发布)之后,你需要使用装饰器.不要直接扩展EntityManager.首先,您需要实现自己的实体管理器装饰器,扩展Doctrine\ORM\Decorator\EntityManagerDecorator(如@Dana)但是您不能只将doctrine.orm.entity_manager.class更改为新装饰器,因为EntityManagerDecorator需要EntityManagerInterface在其构造函数中:

public function __construct(EntityManagerInterface $wrapped)
Run Code Online (Sandbox Code Playgroud)

你不能只将doctrine.orm.entity_manager作为参数传递给它,因为它将是一个递归.不要这样做:

return new self(\Doctrine\ORM\EntityManager::create(
Run Code Online (Sandbox Code Playgroud)

你需要的是在像装饰器这样的服务中配置装饰器:

yourcompany_entity_manager:
    public: false
    class: YourCompany\ORM\EntityManagerDecorator
    decorates: doctrine.orm.default_entity_manager
    arguments: ["@yourcompany_entity_manager.inner"]
Run Code Online (Sandbox Code Playgroud)

现在,您将把装饰器作为Doctrine的默认实体管理器.@ yourcompany_entity_manager.inner实际上是一个指向doctrine.orm.default_entity_manager的链接,该链接将传递给yourcompany_entity_manager构造函数.

用于配置装饰器的Symfony文档:链接

顺便说一句,这个命令对于调试你的服务非常有用:

app/console container:debug | grep entity_manager

  • 请注意,装饰器配置可从Symfony 2.5获得 (3认同)

Ste*_*nte 7

是的,可以通过两个步骤:

1 - 覆盖doctrine.orm.entity_manager.class参数以指向您的自定义实体管理器(应该扩展)Doctrine\ORM\EntityManager.

2 - 您的自定义实体管理器必须覆盖该create方法,以便它返回您的类的实例.请参阅下面的示例,并注意最后一行MyEntityManager:

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

        if (is_array($conn)) {
            $conn = \Doctrine\DBAL\DriverManager::getConnection($conn, $config, ($eventManager ? : new EventManager()));
        } else if ($conn instanceof Connection) {
            if ($eventManager !== null && $conn->getEventManager() !== $eventManager) {
                throw ORMException::mismatchedEventManager();
            }
        } else {
            throw new \InvalidArgumentException("Invalid argument: " . $conn);
        }

        // This is where you return an instance of your custom class!
        return new MyEntityManager($conn, $config, $conn->getEventManager());
    }
Run Code Online (Sandbox Code Playgroud)

您还需要use在课堂上进行以下操作:

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\ORMException;
use Doctrine\Common\EventManager;
use Doctrine\DBAL\Connection;
Run Code Online (Sandbox Code Playgroud)

说实话,我很惊讶第二步是必需的,我认为应该可以只使用服务容器来完成.