Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Symfony控制器中调用KernelInterface_Php_Symfony - Fatal编程技术网

Php 在Symfony控制器中调用KernelInterface

Php 在Symfony控制器中调用KernelInterface,php,symfony,Php,Symfony,我需要从控制器运行一些Symfony命令,以便服务器不支持ssh连接 我找到了这个Symfony docs 此代码几乎类似于Symfony docs中的一个示例 但是当代码运行时,我得到了这个错误 提供的类型“Symfony\Component\HttpKernel\KernelInterface”是 接口,并且无法实例化 Symfony版本是3.3 PHP版本是7.1 我必须补充一点,我使用的是FOSRest包,但我想这应该不是问题 我做错了什么? 我错过什么了吗 我通过在construct

我需要从控制器运行一些Symfony命令,以便服务器不支持ssh连接

我找到了这个Symfony docs

此代码几乎类似于Symfony docs中的一个示例

但是当代码运行时,我得到了这个错误

提供的类型“Symfony\Component\HttpKernel\KernelInterface”是 接口,并且无法实例化

Symfony版本是3.3
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我刚刚找到了有效的解决方案,你能检查一下吗?