在Symfony Controller中调用KernelInterface

时间:2017-12-02 14:56:47

标签: php symfony

我需要从控制器运行一些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捆绑包,但我想这应该不是问题。

我在这里做错了什么? 我错过了什么吗?

2 个答案:

答案 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。