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

Получение контейнера обслуживания в 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 более неинтуитивным?

4b9b3361

Ответ 1

Похоже, что контейнер обслуживания не был инициализирован в configure. Я могу получить к нему доступ в execute.

Что касается параметров по умолчанию для параметров консоли, я могу использовать что-то вроде

$opt1 = $input->getOption('opt1') ? : $default;

Во многих случаях Symfony2 позволяет установить значение по умолчанию при извлечении параметров/переменных. Таким образом, ярлык для вышеупомянутого решения будет просто:

$opt1 = $input->getOption('opt1', $default);

Просто поставив это как ответ, чтобы я мог закрыть это, если нет других ответов.

Ответ 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();

что мне было нужно.