首页 > 解决方案 > 在命令中使用控制器作为服务

问题描述

我正在尝试使用 Symfony 命令中的 Wkhtmltopdf。

我决定使用KnpSnappyBundle,所以我创建了一个用作服务的控制器。

wkhtmltopdfController.php

class WkhtmltopdfController extends Controller {

public function indexUrl()
{
    $snappy = $this->get('knp_snappy.pdf');
    $filename = 'myFirstSnappyPDF';
    $url = 'http://ourcodeworld.com';


    return new Response(
        $snappy->getOutput($url),
        200,
        array(
            'Content-Type'          => 'application/pdf',
            'Content-Disposition'   => 'inline; filename="'.$filename.'.pdf"'
        )
    );
}}

然后我像这样从我的 Command 构造函数中导入这个服务。

我的命令

class GenerateQuittance extends Command {

private $snappy;
private $container;

public function __construct(WkhtmltopdfController $knpSnappyPdf, ContainerInterface $container)
{
    parent::__construct();
    $this->snappy = $knpSnappyPdf;
    $this->container = $container;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
 [...]
 $this->snappy->indexUrl();
}

但是我在运行命令“app:myCommand”时遇到 [error] 错误。消息:“在 null 上调用成员函数 get()”

那么如何将我的方法从 WkhtmltopdfController 用于命令。

谢谢,

标签: phpsymfonywkhtmltopdfsymfony4

解决方案


将控制器作为服务注入通常是个坏主意,因为它们得到了 Symfony 的特殊处理。考虑将您的方法重构WkhtmltopdfController::indexUrl()为单独的服务。您可能还想将$filename变量转换为参数并将方法的返回值转换为普通输出而不是Response.

另请注意,注入ContainerInterface也被认为是一种不好的做法,您需要明确列出要注入的服务。

您的特定错误很可能是由于get()方法由ContainerTrait预期ContainerInterface可用(通过ContainerAwareTrait在基本容器中使用)提供的事实引起的,但在 console 的情况下可能不会发生这种注入Application


推荐阅读