我有3个服务和1个控制器。问题在于爷爷服务在自动构造函数参数方面存在问题。
RegistrationController
的操作具有RegisterDB
服务作为参数。RegisterDB
扩展了DBALProvider
服务。DBALProvider
扩展了BaseService
服务。DBALProvider
的构造函数可以自动关联一些参数,并将其保存到由getter返回的属性中。BaseService
的构造函数不会自动装配参数,因此其属性为null(预期不为null )。裸机最低代码:
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
,但是第二个转储显示了预期的连接对象。我的继承链有什么问题?
感谢反馈。
答案 0 :(得分:3)
这确实与自动装配无关,但与继承的工作方式无关。
由于您的BaseService
需要一个TranslatorInterface
的实例,因此您需要将其传递给DBALProvider
类中的父构造函数:
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;
}
}