Я хочу несколько команд терминала для своего приложения 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
Надеюсь, это поможет кому-то.