Как использовать мои сущности и сущности в команде 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, а не объект, как ожидалось. Думаю, что я оставил важный шаг, но какой? И как я наконец смогу использовать мои настройки и сущности?
Ответы
Ответ 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
Надеюсь, что это поможет кому-то.