如何从控制器运行symfony 2 run命令

Pay*_*teR 45 command controller symfony

我想知道如何从浏览器查询或控制器运行Symfony 2命令.

因为我没有任何可能在托管运行它,每个cron作业都由管理员设置.

我甚至没有启用exec()功能所以当我想测试它时,我必须将命令中的所有内容复制到某个测试控制器,这不是最佳解决方案.

Dmi*_*riy 66

有关较新版本的Symfony,请参阅有关此问题的官方文档


您不需要从控制器执行命令的服务,我认为最好通过run方法调用命令而不是通过控制台字符串输入,但官方文档建议您通过它的别名调用命令.另外,请看这个答案.在Symfony 2.1-2.6上测试.

您的命令类必须扩展 ContainerAwareCommand

// Your command

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

class MyCommand extends ContainerAwareCommand {
    // …
}


// Your controller

use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;

class SomeController extends Controller {

    // …

    public function myAction()
    {
        $command = new MyCommand();
        $command->setContainer($this->container);
        $input = new ArrayInput(array('some-param' => 10, '--some-option' => true));
        $output = new NullOutput();
        $resultCode = $command->run($input, $output);
    }
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,你不需要BufferedOutput(从Jbm的答案),它足以检查$resultCode is 0,否则出现错误.

  • 您还需要将执行的命令名称作为`ArrayInput`的第一个元素(至少在Symfony2.6上). (3认同)
  • 如果命令很耗时,你可能需要增加执行时间以避免超时:`ini_set('max_execution_time',600);`. (2认同)

Reu*_*ven 57

将您的命令注册为服务,不要忘记致电 setContainer

MyCommandService:
    class: MyBundle\Command\MyCommand
    calls:
        - [setContainer, ["@service_container"] ]
Run Code Online (Sandbox Code Playgroud)

在您的控制器中,您只需要获取此服务,并使用权限参数调用execute方法

使用setArgument方法设置输入:

$input = new Symfony\Component\Console\Input\ArgvInput([]);
$input->setArgument('arg1', 'value');
$output = new Symfony\Component\Console\Output\ConsoleOutput();
Run Code Online (Sandbox Code Playgroud)

调用run命令的方法:

$command = $this->get('MyCommandService');
$command->run($input, $output);
Run Code Online (Sandbox Code Playgroud)


mal*_*c4k 10

在我的环境(Symony 2.1)中,我必须对@Reuven解决方案进行一些修改才能使其正常工作.他们来了:

服务定义 - 无变化.

在控制器中:

use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;

...

public function myAction() {
    $command = $this->get('MyCommandService');

    $input = new ArgvInput(array('arg1'=> 'value'));
    $output = new ConsoleOutput();

    $command->run($input, $output);
}
Run Code Online (Sandbox Code Playgroud)