繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM