动态根据 URL 参数生成不同发票内容的 PHP 教程

本文教你如何在 Laravel 中通过路由参数(如 /admin/invoice/1)动态识别发票 ID,并基于该 ID 渲染不同客户信息与商品数据,最终生成定制化 PDF 发票,避免硬编码 URL 判断。

本文教你如何在 Laravel 中通过路由参数(如 `/admin/invoice/1`)动态识别发票 ID,并基于该 ID 渲染不同客户信息与商品数据,最终生成定制化 PDF 发票,避免硬编码 URL 判断。

在 Laravel 开发中,直接用完整 URL 字符串(如 'http://localhost/...')作为 if 条件判断是完全错误且不可靠的——它既无法获取当前请求的真实路径,也不符合 MVC 架构规范,更会导致逻辑僵化、难以维护。正确做法是利用 Laravel 路由参数绑定机制,将 URL 中的动态段(如 {id})自动注入控制器方法,再据此查询或构造差异化数据。

✅ 正确实现方式:使用路由参数 + 业务逻辑分支

首先,确保你的路由已正确定义(你已做到):

// routes/web.php
Route::get('admin/invoice/{id}', [InvoiceController::class, 'show'])->name('invoice.show');

⚠️ 注意:末尾斜杠 / 在 Laravel 中非必需,建议统一省略以避免重定向歧义;同时为路由命名便于后续维护。

接着,在控制器中接收并使用 $id 参数(Laravel 会自动类型提示解析为整型):

<?php
namespace App\Http\Controllers;

use LaravelDaily\Invoices\Invoice;
use LaravelDaily\Invoices\Classes\Buyer;
use LaravelDaily\Invoices\Classes\InvoiceItem;
use App\Models\Invoice1; // 确保该模型存在且可查询真实数据

class InvoiceController extends Controller
{
    public function show(int $id)
    {
        // 根据 ID 查询数据库中的发票记录(推荐方式)
        $invoiceData = Invoice1::findOrFail($id);

        // 或使用硬编码映射(仅用于演示,生产环境务必查库)
        $config = [
            1 => [
                'name' => 'Ahmed',
                'email' => '[email protected]',
                'title' => 'Reservation 1',
                'price' => 245,
                'series' => '10',
                'sequence' => 10000,
            ],
            2 => [
                'name' => 'Abdullah',
                'email' => '[email protected]',
                'title' => 'Reservation 2',
                'price' => 467,
                'series' => '10',
                'sequence' => 10001,
            ],
        ];

        if (!isset($config[$id])) {
            abort(404, 'Invoice not found');
        }

        $customer = new Buyer([
            'name'          => $config[$id]['name'],
            'custom_fields' => [
                'Email' => '<a href="mailto:' . $config[$id]['email'] . '">' . $config[$id]['email'] . '</a>',
            ],
        ]);

        $item = (new InvoiceItem())
            ->title($config[$id]['title'])
            ->pricePerUnit($config[$id]['price']);

        $invoice = Invoice::make()
            ->buyer($customer)
            ->series($config[$id]['series'])
            ->sequence($config[$id]['sequence'])
            ->dateFormat('m/d/Y')
            ->currencySymbol('SR')
            ->discountByPercent(10)
            ->taxRate(15)
            ->addItem($item);

        return $invoice->stream("invoice_{$id}.pdf");
    }
}

? 关键要点说明

? 总结

动态页面内容的核心在于解耦展示逻辑与请求标识。Laravel 的路由参数机制正是为此而生:它让控制器专注业务,URL 仅作语义化入口。结合数据库查询或配置映射,即可轻松扩展至数百种发票模板,同时保持代码清晰、可测试、易维护。切勿陷入“字符串匹配 URL”的反模式陷阱。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。