我需要为来自symfony2配置的一些查询设置一个参数。
通常你会从存储库类之外传递那个参数,但在这种情况下我不想这样做。
我已经查看了一个自定义函数(因为它已经在播放),但是我无法使用服务作为Doctrine的自定义函数。所以我需要做一些讨厌的事情来从ServiceContainer获取参数。 类似于SqlWalkers的情况。
我认为最好甚至可以将参数推送到Doctrine配置对象或EntityManager中。 这将允许我从CustomFunction中的Query对象获取参数,并在需要时将其添加到查询中。
如果无法做到这一点,那么一个好的选择就是让Repository类中的参数可用。这样就不需要手动传递给Repository类。
有没有办法在Doctrine配置中注入一些自定义参数?还是Repository类? 有没有人有更好的解决方案?
答案 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%
请记住,如果您有其他实体经理,则可能需要多次执行此操作。