Подтвердить что ты не робот

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

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

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

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

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

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

$this->getApplication()

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

class YourCmdCommand extends ContainerAwareCommand

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

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

Ответ 3

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

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

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