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
,否则出现错误.
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)
归档时间: |
|
查看次数: |
44162 次 |
最近记录: |