php - 在命令中使用控制器作为服务
问题描述
我正在尝试使用 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 用于命令。
谢谢,
解决方案
将控制器作为服务注入通常是个坏主意,因为它们得到了 Symfony 的特殊处理。考虑将您的方法重构WkhtmltopdfController::indexUrl()
为单独的服务。您可能还想将$filename
变量转换为参数并将方法的返回值转换为普通输出而不是Response
.
另请注意,注入ContainerInterface
也被认为是一种不好的做法,您需要明确列出要注入的服务。
您的特定错误很可能是由于get()
方法由ContainerTrait
预期ContainerInterface
可用(通过ContainerAwareTrait
在基本容器中使用)提供的事实引起的,但在 console 的情况下可能不会发生这种注入Application
。
推荐阅读
- python - python multiprocessing + peewee + postgresql 因 SSL 错误而失败
- swift - 如何将两个按钮放入一个框中并按行分隔?
- ios - 尝试从 unwind segue 添加新的 webView 时,如何清除 WKWebView?
- asp.net - IIS 无法将 Windows 凭据传递到 SQL Server for ASP.NET Core 应用程序
- javascript - 如何将动态带注释的时间线图表直接嵌入到 Google 表格中
- regex - 雪花正则表达式
- ios - 自定义 UITableViewCell 的选择行为
- javafx - 当我的应用程序失去焦点时如何监听?
- c# - 删除'button1'字段并在相关方法中将其声明为局部变量
- if-statement - 仅在文件不存在时运行脚本