【发布时间】:2014-11-29 10:41:14
【问题描述】:
我有一个需要实体存储库的表单事件订阅者。 我想理想地注入这个存储库依赖项,而不必使用订阅者及其父对象的构造函数,因为这个订阅者需要以多种不同的形式。
所以基本上我有以下链:
控制器调用-> CustomManagerService 实例化-> 表单实例化-> EventSubscriber 需求-> EntityRepository
manager 已经是一项服务。将构造函数存储库参数从管理器通过表单传输到订阅者很痛苦,而且将每个表单设置为服务也很痛苦。
为什么我不能直接在订阅者中实例化存储库?我读过这是一种不好的做法。
编辑:这是我目前所拥有的:
在我的控制器中:
$unitRepository = $this->getDoctrine()->getRepository('UnitRepository');
$myManager = $this->get('my_manager')
$form = $myManager->createForm($unitRepository);
在我的管理器中:
public function createForm(UnitRepository $unitRepository){
return $this->formFactory->createForm(
new xxxType($unitRepository)
}
以我的形式:
use MyBundle/AddUnitFieldSubscriber;
protected $unitRepository;
public function __construct(UnitRepository $unitRepository)
{
$this->unitRepository = $unitRepository;
}
public function buildform()
{
$builder->addEventSubscriber(new AddUnitFieldSubscriber($this->unitRepository));
}
在我的订阅者中: 受保护的 $unitRepository;
public function __construct(UnitRepository $unitRepository)
{
$this->unitRepository = $unitRepository;
}
public function preSetData(FormEvent $event)
{
$unitRepository = $this->unitRepository;
$unitRepository->doStuff()
}
我发现这非常冗长,有时我有一个调用子表单的表单,它是使用 eventSubscriber 的表单。如果我将表单设置为服务,有时也会出现错误,因为我在没有所需的第一个构造参数的情况下实例化它们。
在只知道订阅者需要访问存储库的情况下不重复所有这些操作的最短路径是什么?
非常感谢!
【问题讨论】:
-
你能告诉我们你的服务定义吗?
-
实例化存储库需要访问实体管理器(我假设您使用的是 Doctrine 2)。因此,直接在订阅者中实例化存储库将无济于事。如果表单需要注入额外的服务,那么您将表单设置为服务。一旦你做了一些,这很容易。您还可以将订阅者设为服务并将其注入到表单中。
-
@Cerad,那我需要将表单设为服务吗?如果我继续在我的 Manager 中实例化表单,比如 new xxxType() 没有参数,我感觉它会抛出一个错误,不是吗?
标签: symfony service constructor dependency-injection repository