我正在尝试通过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中使用我的方法。
谢谢
答案 0 :(得分:2)
将控制器作为服务注入通常不是一个好主意,因为它们会从Symfony获得特殊处理。考虑将您的WkhtmltopdfController::indexUrl()
方法重构为单独的服务。您可能还希望将$filename
变量转换为参数,并将方法的返回值转换为普通输出,而不是Response
。
请注意,注入ContainerInterface
也被认为是不好的做法,您需要显式列出要注入的服务。
您的特定错误最有可能是由于get()
提供了ContainerTrait
方法而期望ContainerInterface
可用(通过在基本容器中使用ContainerAwareTrait
)引起的,但是在控制台Application
中可能不会发生这种注入。