I think you should not retrieve the container in the constructor directly. Instead, retrieve it in the configure
method or in the execute
method. In my case, I get my entity manager just at the start of the execute
method like this and everything is working fine (tested with Symfony 2.1).
protected function execute(InputInterface $input, OutputInterface $output)
{
$entityManager = $this->getContainer()->get('doctrine')->getEntityManager();
// Code here
}
I think that the instantiation of the application object is not done yet when you are calling getContainer
in your constructor which result in this error. The error comes from the getContainer
method tyring to do:
$this->container = $this->getApplication()->getKernel()->getContainer();
Since getApplication
is not an object yet, you get the a error saying or are calling a method getKernel
on a non-object.
Update: In newer version of Symfony, getEntityManager
has been deprecated (and could have been removed altogether by now). Use $entityManager = $this->getContainer()->get('doctrine')->getManager();
instead. Thanks to Chausser for pointing it.
Update 2: In Symfony 4, auto-wiring can be used to reduce amount of code needed.
Create a __constructor
with a EntityManagerInterface
variable. This variable will be accessible in the rest of your commands. This follows the auto-wiring Dependency Injection scheme.
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();
}
}
Credits to @profm2 for providing the comment and the code sample.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…