Получение контейнера обслуживания в Symfony 2 Console Command дает "getKernel() для не-объекта"
В функции configure()
я попытался получить контейнер службы
class SetQuotaCommand extends ContainerAwareCommand {
protected function configure() {
parent::configure();
die(get_class($this->getContainer()));
PHP Fatal error: Call to a member function getKernel() on a non-object in ...\Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand.php on line 37
Нужно ли делать что-то другое?
UPDATE
Я заметил, что он работает, если я вызываю getContainer
в execute()
. Но мне интересно, возможно ли его getContainer()
в configure()
. Я хочу получить параметр конфигурации для использования в аргументе значения addOption
по умолчанию.
В противном случае я мог бы использовать
$param1 = $input->getOption('param1') ? : $container->getParameter('param1');
Который кажется abit более неинтуитивным?
Ответы
Ответ 1
Похоже, что контейнер обслуживания не был инициализирован в configure
. Я могу получить к нему доступ в execute
.
Что касается параметров по умолчанию для параметров консоли, я могу использовать что-то вроде
$opt1 = $input->getOption('opt1') ? : $default;
Во многих случаях Symfony2 позволяет установить значение по умолчанию при извлечении параметров/переменных. Таким образом, ярлык для вышеупомянутого решения будет просто:
$opt1 = $input->getOption('opt1', $default);
Просто поставив это как ответ, чтобы я мог закрыть это, если нет других ответов.
Ответ 2
Вызвать $this->container = $this->getApplication()->getKernel()->getContainer();
в execute().
См. fooobar.com/questions/139085/...
Ответ 3
Несмотря на всю информацию, которую я нашел в Google (включая эту тему), ничего не работает. Я, наконец, понял, почему я не смог получить ядро.
В копии 1:1 из документов я создал файл application.php:
#!/usr/bin/env php
<?php
// application.php
require __DIR__.'/vendor/autoload.php';
require __DIR__.'/app/AppKernel.php';
use X\SnmpBundle\Command\GreetCommand;
use Symfony\Component\Console\Application;
$application = new Application();
$application->add(new GreetCommand());
$application->run();
И затем запустите приложение, выполнив:
./application.php this: that или php application.php this: that
Это не сработало для меня. По какой-то причине ядро недоступно при этом. Однако, когда я запускаю приложение, используя:
php app/console:
Я предполагаю, что запущенное приложение app/console делает намного больше, чем мой application.php, например, запуск ядра.
При запуске приложения в качестве "php app/console" это: "все работает нормально, и я могу использовать:
$this->getContainer()->get('doctrine')->getManager();
что мне было нужно.