我需要从控制器运行一些Symfony命令,以便服务器不支持ssh连接。
我找到了这个Symfony文档 https://symfony.com/doc/3.3/console/command_in_controller.html
/**
* @Route("/command/run")
* @Method("POST")
*
* @param KernelInterface $kernel
*
* @return Response
* @throws \Exception
*/
public function runCommandAction(KernelInterface $kernel)
{
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'doctrine:schema:update',
"--force" => true
]);
$output = new BufferedOutput();
$application->run($input, $output);
$content = $output->fetch();
return new Response($content);
}
这段代码几乎就像Symfony docs的一个例子。
但是在代码运行时我收到了这个错误。
提供的类型“Symfony \ Component \ HttpKernel \ KernelInterface”是一个 界面,无法实例化
Symfony版本是3.3
PHP版本是7.1
我必须补充说我正在使用FOSRest捆绑包,但我想这应该不是问题。
我在这里做错了什么? 我错过了什么吗?
答案 0 :(得分:1)
我通过在构造类中添加接口解决了这个问题。
/**
* @var KernelInterface
*/
private $kernel;
public function __construct(KernelInterface $kernel)
{
$this->kernel = $kernel;
}
/**
* @Route("/command/run")
* @Method("POST")
*
* @param KernelInterface $kernel
*
* @return Response
* @throws \Exception
*/
public function runCommandAction()
{
$application = new Application($this->kernel);
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'doctrine:schema:update',
"--force" => true
]);
$output = new BufferedOutput();
$application->run($input, $output);
$content = $output->fetch();
return new Response($content);
}
答案 1 :(得分:0)
我认为在控制器中获取内核的最简单方法就是这样。
$this->get('kernel')
因此,不要像这样将内核作为私有成员变量添加到控制器对象中。
$application = new Application($this->kernel);
我这样做。
$application = new Application($this->get('kernel'));
我目前仍在运行3.4。