Laravel 5生成发票并通过电子邮件将其与mpdf附件一起发送



我正在运行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',
]);
}

最新更新