Получение служебного контейнера в Symfony 2 Консольная команда выдает «getKernel () для необъекта» - PullRequest
12 голосов
/ 05 января 2012

В функции 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'); 

Что выглядит более не интуитивно понятным?

Ответы [ 3 ]

20 голосов
/ 09 марта 2012

Вызов $this->container = $this->getApplication()->getKernel()->getContainer(); в execute (). Смотри https://stackoverflow.com/a/7517803/297679

2 голосов
/ 25 июня 2015

Несмотря на всю информацию, которую я нашел в 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: that" все работает нормально, и я могу использовать:

$this->getContainer()->get('doctrine')->getManager();

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

2 голосов
/ 06 января 2012

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

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

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

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

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

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

...