如何在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
希望这可以帮助别人。