Symfony 4.3 - 无法在嵌套继承中自动装配服务参数
Symfony 4.3 - Cannot autowire service argument in nested inheritance
我有 3 个服务和 1 个控制器。问题是祖父服务在自动装配其构造函数参数时遇到问题。
RegistrationController
具有将RegisterDB
服务作为参数的操作。
RegisterDB
扩展 DBALProvider
服务。
DBALProvider
扩展 BaseService
服务。
DBALProvider
具有自动装配一些参数并将它们保存到由 getter 返回的属性的构造函数。
BaseService
具有 不 自动装配参数的构造函数,因此其 属性 为 null(not null expected ).
最低代码:
RegistrationController.php
class RegistrationController extends AbstractController
{
public function register(RegisterDB $registerDB)
{
$registerDB->registerUser();die;
}
}
RegisterDB.php
class RegisterDB extends DBALProvider
{
public function registerUser()
{
dump($this->getTranslator());
dump($this->getContext());
}
}
DBALProvider.php
class DBALProvider extends BaseService
{
private $context;
public function __construct(EntityManagerInterface $entityManager)
{
$this->context = $entityManager->getConnection();
}
protected function getContext()
{
return $this->context;
}
}
BaseService.php
class BaseService
{
private $translator;
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
protected function getTranslator()
{
return $this->translator;
}
}
问题是在 RegisterDB.php 第一次转储中 dump($this->getTranslator());
输出 null
但第二次转储显示预期的连接对象。我的继承链有什么问题?
感谢反馈。
这确实与自动装配无关,但与继承的工作方式有关。
由于您的 BaseService
需要 TranslatorInterface
的实例,因此您需要将其传递给 DBALProvider
class:
中的父构造函数
class DBALProvider extends BaseService
{
private $context;
public function __construct(EntityManagerInterface $entityManager, TranslatorInterface $translator)
{
$this->context = $entityManager->getConnection();
parent::__construct($translator);
}
protected function getContext()
{
return $this->context;
}
}
我有 3 个服务和 1 个控制器。问题是祖父服务在自动装配其构造函数参数时遇到问题。
RegistrationController
具有将RegisterDB
服务作为参数的操作。RegisterDB
扩展DBALProvider
服务。DBALProvider
扩展BaseService
服务。DBALProvider
具有自动装配一些参数并将它们保存到由 getter 返回的属性的构造函数。BaseService
具有 不 自动装配参数的构造函数,因此其 属性 为 null(not null expected ).
最低代码:
RegistrationController.php
class RegistrationController extends AbstractController
{
public function register(RegisterDB $registerDB)
{
$registerDB->registerUser();die;
}
}
RegisterDB.php
class RegisterDB extends DBALProvider
{
public function registerUser()
{
dump($this->getTranslator());
dump($this->getContext());
}
}
DBALProvider.php
class DBALProvider extends BaseService
{
private $context;
public function __construct(EntityManagerInterface $entityManager)
{
$this->context = $entityManager->getConnection();
}
protected function getContext()
{
return $this->context;
}
}
BaseService.php
class BaseService
{
private $translator;
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
protected function getTranslator()
{
return $this->translator;
}
}
问题是在 RegisterDB.php 第一次转储中 dump($this->getTranslator());
输出 null
但第二次转储显示预期的连接对象。我的继承链有什么问题?
感谢反馈。
这确实与自动装配无关,但与继承的工作方式有关。
由于您的 BaseService
需要 TranslatorInterface
的实例,因此您需要将其传递给 DBALProvider
class:
class DBALProvider extends BaseService
{
private $context;
public function __construct(EntityManagerInterface $entityManager, TranslatorInterface $translator)
{
$this->context = $entityManager->getConnection();
parent::__construct($translator);
}
protected function getContext()
{
return $this->context;
}
}