我试图使用Process Component从我的控制器运行控制台命令,但它不起作用。
这是我的代码:
$process = new Process('php bin/console mycommand:run');
$process->setInput($myArg);
$process->start();
我也尝试过:
$process = new Process('php bin/console mycommand:run ' . $myArg)
$process->start();
我使用以下命令运行命令:
php bin/console mycommand:run my_argument
你能告诉我我做错了什么吗?
我认为问题是路径。无论如何你应该考虑不使用Process
来调用Symfony命令。控制台组件允许调用命令,例如在控制器中。
来自docs的示例:
// src/Controller/SpoolController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;
class SpoolController extends Controller
{
public function sendSpoolAction($messages = 10, KernelInterface $kernel)
{
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput(array(
'command' => 'swiftmailer:spool:send',
// (optional) define the value of command arguments
'fooArgument' => 'barValue',
// (optional) pass options to the command
'--message-limit' => $messages,
));
// You can use NullOutput() if you don't need the output
$output = new BufferedOutput();
$application->run($input, $output);
// return the output, don't use if you used NullOutput()
$content = $output->fetch();
// return new Response(""), if you used NullOutput()
return new Response($content);
}
}
使用这种方式,您可以确保代码始终有效。当PHP处于安全模式(exec
等关闭)时,Process
组件是无用的。此外,您不需要关心路径和其他事情,否则您调用的情况是“手动”命令。
您可以阅读有关从控制器here调用命令的更多信息。