我想你不應該直接在構造函數中檢索容器。相反,請在configure
方法或execute
方法中檢索它。在我的情況下,我的實體管理器就在這樣的execute
方法的開頭,並且一切工作正常(用Symfony 2.1進行測試)。
protected function execute(InputInterface $input, OutputInterface $output)
{
$entityManager = $this->getContainer()->get('doctrine')->getEntityManager();
// Code here
}
我認爲,當你在你的構造函數,導致此錯誤調用getContainer
應用程序對象的實例化沒有完成呢。錯誤來自getContainer
方法tyring做:
$this->container = $this->getApplication()->getKernel()->getContainer();
由於getApplication
是不是一個對象呢,你會得到一個錯誤說或呼籲非對象的方法getKernel
。
更新:在較新版本的Symfony中,getEntityManager
已被棄用(現在可能已被完全刪除)。改爲使用$entityManager = $this->getContainer()->get('doctrine')->getManager();
。感謝Chausser指向它。
更新2:在Symfony 4中,可以使用自動佈線來減少所需的代碼量。使用EntityManagerInterface
變量創建__constructor
。這個變量將在其餘的命令中被訪問。這遵循自動佈線依賴注入方案。
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提供評論和代碼示例。
我有同樣的錯誤時,(我試圖訪問'getContainer() 'MyCommand-> execute()'裏面,但仍然得到相同的致命錯誤。我的'CommandTest擴展\ PHPUnit_Framework_Testcase',我通過'phpunit -c app src/CompanyName/MyBundle/Tests/Commands/MyCommandTest.php'運行它。任何想法可能是錯誤的? –