我有一个id为manager_provider
的服务,我想创建一个名为ManagerAwareType
的基本表单类,并注入此服务。因此,所有扩展此类的表单类都可以访问manager_provider
:
abstract class ManagerAwareType extends AbstractType
{
/** @var ManagerProvider */
private $managerProvider;
// getter and setter...
}
所以我的第一次尝试是在_instanceof
中使用services.yaml
声明这个:
_instanceof:
MyBundle\Form\ManagerAwareType:
tags: [form.type]
calls:
- [setManagerProvider, ["@manager_provider"]]
但是当我在Controller中创建表单时$managerProvider
是null
。然后我尝试在DependencyInjection\Extension
类中以编程方式执行相同的操作,代码正在执行而没有任何错误(使用调试器检查):
$managerAwareType = new Definition(ManagerAwareType::class);
$managerAwareType->addTag('form.type');
$managerAwareType->addMethodCall('setManagerProvider', [new Definition('manager_provider')]);
$container->addDefinitions([$managerAwareType]);
但是它再次没有用,依赖性没有被注入。
我究竟做错了什么?
P.S:我知道我可以将我的依赖声明为表单选项,并在每次通过Controller创建表单时将其注入,但如果可能,我更喜欢这种方式。
你必须告诉你的ManagerAwareType
课你要注射的课程。通常的方法是将它放在__construct函数中:
abstract class ManagerAwareType extends AbstractType
{
/** @var ManagerProvider */
private $managerProvider;
public function __construct(ManagerProvider $mp)
{
$this->managerProvider = $mp
}
// getter and setter...
}