如何在Symfony 2控制台命令中使用我的实体和实体pipe理器?

我想要一些terminal命令到我的Symfony2应用程序。 我已经通过了食谱中的例子 ,但我无法find如何访问我的设置,我的实体经理和我的实体在这里。 在构造函数中,我得到容器(这应该让我访问设置和实体)使用

$this->container = $this->getContainer(); 

但是这个调用会产生一个错误:

致命错误:调用第38行的/Users/fester/Sites/thinkblue/admintool/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Command/ContainerAwareCommand.php中的非对象的成员函数getKernel()

基本上在ContainerAwareCommand-> getContainer()中调用

 $this->getApplication() 

如预期的那样返回NULL而不是一个对象。 我想我留下了一些重要的步骤,但哪一个? 我将如何终于能够使用我的设置和实体?

我认为你不应该直接在构造函数中检索容器。 而是在configure方法或execute方法中检索它。 在我的情况下,我得到我的实体pipe理器只是在这样的execute方法的开始,一切工作正常(用Symfony 2.1进行testing)。

 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指出它。

从ContainerAwareCommand而不是Command扩展您的命令类

 class YourCmdCommand extends ContainerAwareCommand 

并得到这样的实体经理:

 $em = $this->getContainer()->get('doctrine.orm.entity_manager'); 

我知道Matt的答案解决了这个问题,但如果你有多个实体经理,你可以使用这个:

使用以下方式创buildmodel.xml

 <?xml version="1.0" encoding="UTF-8" ?> <container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> <services> <service id="EM_NAME.entity_manager" alias="doctrine.orm.entity_manager" /> </services> </container> 

然后在你的DI扩展中加载这个文件

 $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('model.xml'); 

那么你可以在任何地方使用它。 在控制台命令中执行:

 $em = $this->getContainer()->get('EM_NAME.entity_manager'); 

最后不要忘记:

 $em->flush(); 

您现在可以将其用作services.yml中另一个服务中的参数:

 services: SOME_SERVICE: class: %parameter.class% arguments: - @EM_NAME.entity_manager 

希望这可以帮助别人。