Symfony 2.4 выполняет команду из контроллера

Я хочу выполнить команду fos:elastica:populate с моего контроллера.

Я попробовал этот код, но он не работает, я получаю ошибку = 1, var_dump показывает ""

$command = 'fos:elastica:populate';
$app = new Application($this->get('kernel'));
$app->setAutoExit(false);
$input = new StringInput($command);
$output = new ConsoleOutput;
$error = $app->run($input, $output);
var_dump($error);
var_dump(stream_get_contents($output->getStream());

Любые идеи ?

Пробую другой код.....

    $command = $this->get('FosElasticaPopulateService');
    $input = new StringInput('');

    $output = new ConsoleOutput();
    ladybug_dump($input);
    // Run the command
    $retval = $command->run($input, $output);

    if(!$retval)
    {
        echo "Command executed successfully!\n";
    }
    else
    {
        echo "Command was not successful.\n";
    }
    var_dump(stream_get_contents($output->getStream()));

В нем говорится: «Опция «без взаимодействия» не существует». at Input ->getOption («без взаимодействия») в PopulateCommand.

если я изменю свой код с помощью:
$input = new StringInput('--no-interaction');

Он говорит: «Опция «--no-interaction» не существует». at
'ArgvInput ->addLongOption ("без взаимодействия", ноль) '


person Sancho    schedule 20.03.2014    source источник


Ответы (3)


Шаг за шагом, как запустить команду очистки кеша: app/console cac:cle --env=(current_env) из контроллера.

Сначала обязательно зарегистрируйте команду как службу (service.yml):

xxx.cache.clear:
    class: Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand
    calls:
        - [setContainer, ["@service_container"] ]

Conde в вашем контроллере:

$command = $this->container->get('xxx.cache.clear');
$input = new ArgvInput(array('--env=' . $this->container->getParameter('kernel.environment')));
$output = new ConsoleOutput();
$command->run($input, $output);

Это все. | проверено на симфони 2.4

person pomaxa    schedule 20.03.2014
comment
С Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand не работает (у меня только одна ошибка с активным сеансом, но неважно. С FOS\ElasticaBundle\Command\PopulateCommand он все еще говорит, что опция без взаимодействия не существует. Есть ли способ дать возможность FOS? - person Sancho; 20.03.2014
comment
@Sancho, все параметры, которые вы хотите передать, нужно добавить в $input var. так что это будет выглядеть так: ```$input = new ArgvInput(array('--env=' . $this-›container-›getParameter('kernel.environment'), '-n')); - person pomaxa; 20.03.2014

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

FosElasticaPopulateService:
    class: Path\To\Bundle\Class
    calls:
        - [setContainer, ["@service_container"] ]

затем в ваш контроллер

$output = new ConsoleOutput;
$command = $this->get('FosElasticaPopulateService');
$command->run(null, $ouput); //null here is for input parameters; if you need them, insert

если он уже зарегистрирован, просто используйте его, как показано выше


Хорошо, я понял: мое решение является альтернативным (возможно, более подходящим для вашей собственной команды, если команда пакета не зарегистрирована как службы изначально). Прочитав некоторую документацию, ваш метод также должен работать. У вас есть ошибка, которая блокирует вас:

$output = new ConsoleOutput; должно быть $output = new ConsoleOutput();

person DonCallisto    schedule 20.03.2014
comment
Теперь у меня есть: $output = new ConsoleOutput; $input = новый ArrayInput(массив(fos:elastica:populate)); $command = $this-›get('FosElasticaPopulateService'); $command-›run($input, $output);. Это не работает. У меня ошибка symfony: аргумент 0 не существует - person Sancho; 20.03.2014
comment
Та же ошибка с: $output = new ConsoleOutput(); $command = $this-›get('FosElasticaPopulateService'); $input = новый ArrayInput(массив(fos:elastica:populate)); $command-›run($input, $output); . Нет простого способа выполнить простую команду? Что-то вроде SymfonyExecute('fos:elastica:populate'); ? - person Sancho; 20.03.2014
comment
@Санчо: что ты делаешь с get('FosElasticaPopulateService');? Я сказал вам, это два альтернативных решения. В вашем коде есть опечатка, не смешивайте и не перепутайте, пожалуйста :) - person DonCallisto; 20.03.2014
comment
я что-то не понимаю... я использую $output = new ConsoleOutput; $command = $this-›get('FosElasticaPopulateService'); $command-›run(null, $output); Это правильно ? В нем говорится, что «run() должен быть экземпляром InputInterface. - person Sancho; 20.03.2014
comment
@Sancho: Извините, если я груб, но ... Вы можете прочитать, что я написал? У тебя опечатка! Вы должны изменить $output = new ConsoleOutput в $output = new ConsoleOutput() Пожалуйста, проверьте под строкой в ​​моем ответе - person DonCallisto; 20.03.2014
comment
Я пробую свой первый код с '$output = new ConsoleOutput();'. Я получил return = 1 (команда не удалась) - person Sancho; 20.03.2014
comment
@Sancho: так что, может быть, у тебя ошибка в команде или при выполнении команды. Но поверьте мне, это правильный путь ;) - person DonCallisto; 20.03.2014

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

person Pavel Petrov    schedule 20.03.2014
comment
Я хочу выполнить команду, заданную пакетом. Я не могу переместить код из fos:elastica в другой класс. - person Sancho; 20.03.2014
comment
Я понимаю. Команда, которую вы пытаетесь выполнить, имеет некоторые обязательные параметры. github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/ Может быть, вы должны установить их через input. - person Pavel Petrov; 20.03.2014
comment
Параметр размер пакета является обязательным и не имеет значения по умолчанию. - person Pavel Petrov; 20.03.2014