【问题标题】:Doctrine EntityManagerDecorator学说 EntityManagerDecorator
【发布时间】:2015-05-30 13:40:18
【问题描述】:

我已经为 EntityManager 创建了自定义装饰器,现在当我在做
doctrine->getManager() 时,我可以获得自定义管理器类,但在存储库类中我仍然有本机 EntityManager 我该如何解决这个问题。或者也许还有另一种方法可以在容器的存储库类中设置一些东西?

装饰器在 $wrapped(EntityManager) 上调用 getRepository,然后 $wrapped 在 RepositoryFactory $this == $wrapped == EntityManager 中传递 $this

我的解决方案是:

    public function getRepository($className)
    {
        $repository = parent::getRepository($className);
        if ($repository instanceof MyAbstractRepository) {
            $repository->setDependency();
        }
        return $repository;
    }

【问题讨论】:

    标签: symfony doctrine-orm


    【解决方案1】:

    有几种方法:

    1. 将静态 EntityManager::createRepository 代码复制到您的实体管理器类并进行相应调整。这是脆弱的,因为对 EntityManager 代码的任何更改都可能会破坏您的代码。您必须跟踪学说更新。但是,它可以工作。

    2. 第二种方法是将存储库定义为服务。然后,您可以在存储库中注入您的实体管理器。有点小技巧,但它避免了克隆 createRepository 代码。

    3. 第三种方法是推荐的方法。不要装饰实体管理器。仔细想想你想要做什么。在大多数情况下,Doctrine 事件或自定义基础存储库类可以满足您的需求。并且它可以让您免于胡闹内部结构。

    【讨论】:

      【解决方案2】:

      一种选择是通过compiler pass 覆盖实体管理器服务类或参数。

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 2012-06-11
        • 2017-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        相关资源
        最近更新 更多