Я думаю, вы не должны извлекать контейнер в конструкторе напрямую.Вместо этого получите его в методе configure
или в методе execute
.В моем случае я получаю свой менеджер сущностей только в начале метода execute
, как этот, и все работает нормально (протестировано с Symfony 2.1).
protected function execute(InputInterface $input, OutputInterface $output)
{
$entityManager = $this->getContainer()->get('doctrine')->getEntityManager();
// Code here
}
Я думаю, что создание экземпляра приложенияобъект еще не завершен, когда вы вызываете getContainer
в своем конструкторе, что приводит к этой ошибке.Ошибка происходит из-за метода getContainer
, связывающего выполнение:
$this->container = $this->getApplication()->getKernel()->getContainer();
Поскольку getApplication
еще не является объектом, вы получаете сообщение об ошибке или вызываете метод getKernel
для не-объекта.object.
Обновление : В более новой версии Symfony getEntityManager
устарел (и может быть уже полностью удален).Вместо этого используйте $entityManager = $this->getContainer()->get('doctrine')->getManager();
.Спасибо Chausser за указание.
Обновление 2 : В Symfony 4 автоматическое подключение может использоваться для уменьшения количества кода, необходимого.
Создайте __constructor
с переменной EntityManagerInterface
.Эта переменная будет доступна в остальных ваших командах.Это соответствует схеме автоматического ввода зависимостей.
class UserCommand extends ContainerAwareCommand {
private $em;
public function __construct(?string $name = null, EntityManagerInterface $em) {
parent::__construct($name);
$this->em = $em;
}
protected function configure() {
**name, desc, help code here**
}
protected function execute(InputInterface $input, OutputInterface $output) {
$this->em->getRepository('App:Table')->findAll();
}
}
Кредиты @ profm2 для предоставления комментария и примера кода.