Symfony 4.3-无法在嵌套继承中自动装配服务参数

时间:2019-10-19 23:45:07

标签: symfony autowired

我有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,但是第二个转储显示了预期的连接对象。我的继承链有什么问题?

感谢反馈。

1 个答案:

答案 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;
  }
}