来自config

时间:2015-07-04 08:59:59

标签: symfony doctrine-orm

我需要为来自symfony2配置的一些查询设置一个参数。

通常你会从存储库类之外传递那个参数,但在这种情况下我不想这样做。

我已经查看了一个自定义函数(因为它已经在播放),但是我无法使用服务作为Doctrine的自定义函数。所以我需要做一些讨厌的事情来从ServiceContainer获取参数。 类似于SqlWalkers的情况。

我认为最好甚至可以将参数推送到Doctrine配置对象或EntityManager中。 这将允许我从CustomFunction中的Query对象获取参数,并在需要时将其添加到查询中。

如果无法做到这一点,那么一个好的选择就是让Repository类中的参数可用。这样就不需要手动传递给Repository类。

有没有办法在Doctrine配置中注入一些自定义参数?还是Repository类? 有没有人有更好的解决方案?

2 个答案:

答案 0 :(得分:0)

什么是存储库?它只不过是Doctrine Manager类中工厂模式的结果。

因此,您可以将存储库定义为容器中的服务。这项服务是工厂电话的结果:

http://php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/

http://symfony.com/doc/current/components/dependency_injection/factories.html

然后,您可以使用呼叫配置注入参数。

答案 1 :(得分:0)

我讨厌回答我自己的问题,但我发现的解决方案与建议的解决方案不同,并且像魅力一样。

简短版本 装饰实体管理器并在返回之前调整Repository类。

长版:创建一个装饰器:

class EntityManagerDecorator extends \Doctrine\ORM\Decorator\EntityManagerDecorator
{
    protected $myProperty;

    public function __construct(EntityManagerInterface $wrapped, ....) {
        parent::__construct($wrapped);
        $this->myProperty = $myProperty;
    }

    // overridden method so we can add some additional logic.
    public function getRepository($className)
    {
        $repository = parent::getRepository($className);

        if ($repository instanceof ExpandedEntityRepository) {
            $repository->setMyProperty($this->myProperty);
        }
        return $repository;
    }
}

创建一个新的Base存储库类,确保从这个类扩展需要它的存储库类。

class ExpandedEntityRepository extends EntityRepository {
    protected $myProperty;
    public function getMyProperty()
    {
        return $this->myProperty;
    }
    public function setMyProperty($myProperty)
    {
        $this->myProperty = $myProperty;
    }
}

我建议你实际用一个接口(你在Decorator中检查)和一个特性(你添加到你的存储库类中以添加所需的方法)来替换它,以使它更优雅。 我使用了基类,因为它仍然需要在PHP5.3

中工作

最后配置您的服务以装饰原始实体管理器:

services:
    my_cool_bundle_entitymanager_decorator:
        public: false
        class: MyCoolBundle\ORM\EntityManagerDecorator
        decorates: doctrine.orm.default_entity_manager
        arguments:
          - @my_cool_bundle_entitymanager_decorator.inner
          - %my_cool_bundle.property%

请记住,如果您有其他实体经理,则可能需要多次执行此操作。