在命令中将控制器用作服务

时间:2019-01-03 14:00:44

标签: php symfony wkhtmltopdf symfony4

我正在尝试通过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构造函数导入此服务。

MyCommand

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”时引发错误。消息:“对成员函数get()的调用为null”。

那么我该如何从WkhtmltopdfController到Command中使用我的方法。

谢谢

1 个答案:

答案 0 :(得分:2)

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

请注意,注入ContainerInterface也被认为是不好的做法,您需要显式列出要注入的服务。

您的特定错误最有可能是由于get()提供了ContainerTrait方法而期望ContainerInterface可用(通过在基本容器中使用ContainerAwareTrait)引起的,但是在控制台Application中可能不会发生这种注入。