我正在运行Laravel 5项目,我在App->Mail->SendEmail中创建了一个控制器,通过mpdf发送带有附加系统生成发票的电子邮件,使用以下代码生成发票,但在发送之前下载在我的浏览器中,当将输出更改为s时,我得到错误"调用成员函数output() on null">
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(Order $order, $data, $mpdf)
{
$mpdf = new MpdfMpdf();
$mpdf->WriteHTML(view('invoices.paid_invoice', compact('order', 'data')));
$fileName = 'Invoice-'.$order->id.'.pdf';
$mpdf->Output($fileName,"D");
$this->order = $order;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.send_order')
->subject(('my subject'))
->attachData($this->mpdf->output(), 'invoice.pdf', [
'mime' => 'application/pdf',])
;
}}
在你的代码中$this->mpdf
没有引用任何东西。
一旦你创建了文件,你就不需要再使用MDF了,所以只需保存文件名并在构建函数中重用它
private $filename;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(Order $order, $data, $mpdf)
{
$mpdf = new MpdfMpdf();
$mpdf->WriteHTML(view('invoices.paid_invoice', compact('order', 'data')));
$this->filename = 'Invoice-'.$order->id.'.pdf';
$mpdf->Output($this->filename,"D");
$this->order = $order;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.send_order')
->subject(('my subject'))
->attach($this->filename, [
'as' => 'invoice.pdf',
'mime' => 'application/pdf',
]);
}
正如@N69S在他们的回答中已经提到的,mPDF对象没有分配给class属性。最好是避免任何"繁重的工作"。类的构造函数中。您只需要调用mPDF的Output方法一次。你也可以直接在构建方法中创建mPDF对象(或者使用一个为Laravel提供Facade的包装器,如果这是你的毒害的话)。
提供的示例的主要问题是,使用第二个参数'D'
时,Output方法直接响应PDF内容(参见Output方法文档中的$dest),并且不返回/保存任何内容。您需要:
将输出保存到$this->filename
属性(在您的示例中也可以是一个局部变量)。这是用$mpdf->Output($this->filename, 'F');
完成的,
或者将PDF的二进制数据输出为带有$mpdf->Output(null, 'S');
的字符串。如果您不需要在生成发票时将PDF保存在服务器上,那么这是最干净的选项。
根据选择的变量,构造函数看起来像这样:
public function __construct(Order $order, $data)
{
$this->data = $data; // define properties for the class
$this->fileName = 'Invoice-'.$order->id.'.pdf';
$this->order = $order;
}
和构建方法看起来像这样:
public function build()
{
$mpdf = new MpdfMpdf();
$mpdf->WriteHTML(view('invoices.paid_invoice', [
'order' => $this->order,
'data' => $this->data
]));
$mpdf->Output($this->filename, 'F');
return $this->markdown('emails.send_order')
->subject(('my subject'))
->attach($this->filename, [
'as' => 'invoice.pdf',
'mime' => 'application/pdf',
]);
}
或:
public function build()
{
$mpdf = new MpdfMpdf();
$mpdf->WriteHTML(/* omitted for readability */);
return $this->markdown('emails.send_order')
->subject(('my subject'))
->attachData($mpdf->Output(null, 'S'), invoice.pdf, [
'as' => 'invoice.pdf',
'mime' => 'application/pdf',
]);
}