Php 在Symfony控制器中调用KernelInterface
我需要从控制器运行一些Symfony命令,以便服务器不支持ssh连接 我找到了这个Symfony docs 此代码几乎类似于Symfony docs中的一个示例 但是当代码运行时,我得到了这个错误 提供的类型“Symfony\Component\HttpKernel\KernelInterface”是 接口,并且无法实例化 Symfony版本是3.3Php 在Symfony控制器中调用KernelInterface,php,symfony,Php,Symfony,我需要从控制器运行一些Symfony命令,以便服务器不支持ssh连接 我找到了这个Symfony docs 此代码几乎类似于Symfony docs中的一个示例 但是当代码运行时,我得到了这个错误 提供的类型“Symfony\Component\HttpKernel\KernelInterface”是 接口,并且无法实例化 Symfony版本是3.3 PHP版本是7.1 我必须补充一点,我使用的是FOSRest包,但我想这应该不是问题 我做错了什么? 我错过什么了吗 我通过在construct
PHP版本是7.1 我必须补充一点,我使用的是FOSRest包,但我想这应该不是问题 我做错了什么?
我错过什么了吗 我通过在construct类中添加接口解决了这个问题
/**
* @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);
}
我通过在construct类中添加接口解决了这个问题
/**
* @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);
}
我认为在控制器中获取内核的最简单方法是这样的
$this->get('kernel')
$application = new Application($this->kernel);
因此,不要像这样将内核作为私有成员变量添加到控制器对象中
$this->get('kernel')
$application = new Application($this->kernel);
我这样做
$application = new Application($this->get('kernel'));
目前我仍在运行3.4。我认为在控制器中获取内核的最简单方法是这样的
$this->get('kernel')
$application = new Application($this->kernel);
因此,不要像这样将内核作为私有成员变量添加到控制器对象中
$this->get('kernel')
$application = new Application($this->kernel);
我这样做
$application = new Application($this->get('kernel'));
目前我仍在运行3.4。我认为您需要在services.yaml文件中创建一个别名。这是最近对autowire的一种更改。我在一个新的S4.0项目上尝试了您的代码,它按预期工作。我认为您必须有两个实现KernelInterface的服务,或者您的供应商需要更新。在任何情况下,请尝试将Symfony\Component\HttpKernel\KernelInterface:“@kernel”添加到您的服务文件中。@Cerad谢谢:)我将通知您,如果这样可以添加答案,我将作为有用的答案:)您可以添加,即使现在您需要。@StevanTosic看起来像是FOSRestBundle正在尝试转换您的参数,有一个未决问题:@Orange18947我刚刚找到了有效的解决方案,你能检查一下吗?我想你需要在services.yaml文件中创建一个别名。这是最近对autowire的一种更改。我在一个新的S4.0项目上尝试了您的代码,它按预期工作。我认为您必须有两个实现KernelInterface的服务,或者您的供应商需要更新。在任何情况下,请尝试将Symfony\Component\HttpKernel\KernelInterface:“@kernel”添加到您的服务文件中。@Cerad谢谢:)我将通知您,如果这样可以添加答案,我将作为有用的答案:)您可以添加,即使现在您需要。@StevanTosic看起来像是FOSRestBundle正在尝试转换您的参数,有一个公开问题:@Orange18947我刚刚找到了有效的解决方案,你能检查一下吗?