Symfony 4.3 - Невозможно автоматически передать служебный аргумент во вложенном наследовании - PullRequest
0 голосов
/ 20 октября 2019

У меня есть 3 службы и 1 контроллер. Проблема в том, что у службы дедушки есть проблема с автоматическим связыванием аргумента конструктора.

  • RegistrationController имеет действие, в качестве аргумента которого используется сервис RegisterDB.
  • RegisterDB extends DBALProvider service.
  • DBALProvider расширяет BaseService service.
  • DBALProvider имеет конструктор, который автоматически связывает некоторые аргументы и сохраняет их в свойствах, возвращаемых получателями.
  • BaseService имеет конструктор, который не имеет аргумента autowire, поэтому его свойство имеет значение 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 1-й дамп dump($this->getTranslator()); выводит null, но 2-й дамп показывает ожидаемый объект подключения. Что не так с моей цепочкой наследования?

Спасибо за отзыв.

1 Ответ

3 голосов
/ 20 октября 2019

Это действительно не имеет ничего общего с автопроводкой, но с тем, как работает наследование.

Поскольку ваш 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;
  }
}
...