在 FilamentPHP 中使用 PDF 生成

145 阅读1分钟

Installation 安装

为了更轻松地处理 PDF,我将使用一个名为 laraveldaily/laravel-invoices 的发票生成器包

因此,让我们从安装此软件包开始:

composer require laraveldaily/laravel-invoices

Implementation 实现

让我们首先在 actions 函数中添加一个新的动作,我们给它起个名字 “Download Pdf”,传递一个 heroicon-o-document-download 图标,在 URL 函数中,我们通过传入一个闭包来获取记录,然后将其重定向到 student.pdf.download 路由并将记录作为参数传递。这里需要注意的另一件事是,我们需要将 model 作为 $record 传递,如果你给它起其他名字,这将引发一个错误。

我们还传入了 openUrlInNewTab() 函数,这只是个人喜好,也取决于用例。

->actions([
            // ...
            Tables\Actions\Action::make('Download Pdf')
                ->icon('heroicon-o-document-download')
                ->url(fn (Student $record) => route('student.pdf.download', $record))
                ->openUrlInNewTab(),
            ])

现在让我们继续定义路由,这段代码是不言自明的:

Route::get('/{record}/pdf/download', [DownloadPdfController::class, 'download'])->name('student.pdf.download');

让我们看看 DownloadPdfController

<?php

namespace App\Http\Controllers;

use App\Models\Student;
use Illuminate\Http\Request;
use LaravelDaily\Invoices\Invoice;
use LaravelDaily\Invoices\Classes\Buyer;
use LaravelDaily\Invoices\Classes\InvoiceItem;

class DownloadPdfController extends Controller
{
    public function download(Student $record)
    {
        $customer = new Buyer([
            'name'          => 'John Doe',
            'custom_fields' => [
                'email' => 'test@example.com',
            ],
        ]);

        $item = (new InvoiceItem())->title('Service 1')->pricePerUnit(2);

        $invoice = Invoice::make()
            ->buyer($customer)
            ->discountByPercent(10)
            ->taxRate(15)
            ->shipping(1.99)
            ->addItem($item);

        return $invoice->stream();
    }
}

下载函数中的代码包含用于 PDF 生成的逻辑,您可以根据您的用例相应地定义逻辑。

如果我们继续刷新表格,我们应该会在 Edit 和 Delete 按钮旁边看到一个 Download Pdf。如果单击,将打开一个新选项卡,在其中呈现我们的 PDF。