[英]Laravel 5 generate invoice & send it by email in attachment with mpdf
我正在运行 Laravel 5 项目,我在 App->Mail->SendEmail 中创建了一个 controller 以通过 mpdf 发送带有系统生成的附加发票的电子邮件,使用以下代码生成发票但在发送之前在我的浏览器中下载,并且将 output 更改为 s 时出现错误“调用成员 function output() on null”
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(Order $order, $data, $mpdf)
{
$mpdf = new \Mpdf\Mpdf();
$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,因此只需保存文件名并在构建 function 中重复使用
private $filename;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(Order $order, $data, $mpdf)
{
$mpdf = new \Mpdf\Mpdf();
$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 object 没有分配给 class 属性。 最好的办法是避免在 class 的构造函数中进行任何“繁重的工作”。您需要恰好调用 mPDF 的 Output 方法一次。 您还可以直接在构建方法中创建 mPDF object(或者使用 Laravel 的包装器提供外观,如果这是您的毒药)。
所提供示例的主要问题是,使用第二个参数'D'
时,Output 方法直接回显 PDF 内容(请参阅Output 方法文档中的 $dest )并且不返回/保存任何内容。 您需要:
将 output 保存到$this->filename
属性(在您的示例中也可以是局部变量)。 这是通过$mpdf->Output($this->filename, 'F');
完成的。 ,
或 output 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 \Mpdf\Mpdf();
$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 \Mpdf\Mpdf();
$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',
]);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.