Как использовать мои сущности и сущности в команде Symfony 2 Console?

Я хочу несколько команд терминала для своего приложения Symfony2. Я просмотрел пример в кулинарной книге , но не смог узнать, как получить доступ к моим настройкам, моему менеджеру сущности и моим сущностям. В конструкторе я получаю контейнер (который должен давать мне доступ к настройкам и сущностям), используя

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

Но этот вызов вызывает ошибку:

Неустранимая ошибка: вызовите функцию-член getKernel () для не-объекта в /Users/fester/Sites/thinkblue/admintool/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Command/ContainerAwareCommand.php в строке 38

В основном, в ContainerAwareCommand-> getContainer () вызов

 $this->getApplication() 

возвращает NULL, а не объект, как ожидалось. Думаю, что я оставил важный шаг, но какой? И как я наконец смогу использовать свои настройки и сущности?

Я думаю, что вы не должны извлекать контейнер в конструкторе напрямую. Вместо этого извлеките его в методе configure или в методе execute . В моем случае я получаю свой менеджер объектов только в начале метода execute как это, и все работает нормально (проверено с помощью Symfony 2.1).

 protected function execute(InputInterface $input, OutputInterface $output) { $entityManager = $this->getContainer()->get('doctrine')->getEntityManager(); // Code here } 

Я думаю, что экземпляр объекта приложения еще не выполнен, когда вы вызываете getContainer в своем конструкторе, что приводит к этой ошибке. Ошибка возникает из метода tyring getContainer:

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

Поскольку getApplication еще не является объектом, вы получаете сообщение об ошибке или вызываете метод getKernel на не-объект.

Надеюсь, поможет.

С Уважением,
Matt

Обновление : в новой версии Symfony, getEntityManager устарел (и мог быть удален полностью к настоящему времени). Используйте $entityManager = $this->getContainer()->get('doctrine')->getManager(); вместо. Спасибо Chausser за указание на это.

расширяет ваш командный класс из ContainerAwareCommand вместо Command

 class YourCmdCommand extends ContainerAwareCommand 

и получить менеджер сущности следующим образом:

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

Я знаю, что ответ Мэтта решил вопрос, но если у вас более одного менеджера сущностей, вы можете использовать это:

Сделайте model.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 

Надеюсь, это поможет кому-то.