现在就值得尝试的 5 个 Laravel 新包

设想这样一个场景:晚上 11 点,开发者还在调试一个 Laravel 应用,手中唯一的线索却只是一条毫无信息量的通用错误消息。又或者,正在为客户的在线商店开发折扣功能,最终写出层层嵌套的 if-else 语句,复杂到三个月后自己重新阅读时都会感到困惑。

这类情况并不罕见。幸运的是,Laravel 社区从未停止构建能够让开发工作更加轻松的软件包。仅在过去几周内,就出现了五个值得关注的新包——既有 Laravel 核心团队直接发布的官方包,也有以优雅方式解决特定问题的社区包。

下面将逐一介绍这些软件包,并给出安装步骤和使用示例。

1. Laravel Discount 轻松实现优惠券与折扣

如果曾经从零构建过折扣系统,就会熟悉它通常如何逐步失控。最初只是简单的九折优惠,接着突然出现“最高优惠 50 美元”的需求,然后是“仅限 VIP 会员”,再然后是“确保不能与其他促销叠加”。用不了多久,折扣逻辑就会散落在十几个控制器中,几乎无法维护。

由 Milwad Khosravi 开发的 Laravel Discount 通过把这些逻辑全部存储在 Eloquent 模型中,并通过单一 Facade 进行计算,解决了这个问题。

GitHub - binafy/laravel-discount: Laravel Discount 是一个 Laravel 软件包,旨在帮助应用轻松处理折扣。

主要特性

  • 支持百分比和固定金额两种折扣类型,并可选设定最高折扣金额。
  • 支持优惠券代码,也支持无需代码即可自动应用的折扣。
  • 通过 starts_atexpires_at 设置有效时间范围。
  • 支持总使用次数和单个客户使用次数限制,并可通过 Session ID 支持访客。
  • 支持折扣叠加规则,可以允许多个折扣组合,也可以禁止叠加。
  • 可直接与 Laravel Cart 集成。

安装

bash
composer require binafy/laravel-discount
php artisan migrate

第一个基础示例展示如何创建并应用百分比折扣:

php
use Binafy\LaravelDiscount\Enums\DiscountType;
use Binafy\LaravelDiscount\Models\Discount;
use Binafy\LaravelDiscount\Facades\LaravelDiscount;

$discount = Discount::query()->create([
    'name' => 'Summer Sale',
    'type' => DiscountType::Percentage,
    'value' => 20,
    'max_discount_amount' => 100,
]);

$result = LaravelDiscount::apply($discount, 300);
$result->discountAmount;  // 60.0
$result->payableAmount(); // 240.0

第二个示例展示如何应用带使用次数限制的优惠券代码:

php
$result = LaravelDiscount::applyCode('WELCOME10', 200, $user);

// 订单确认且支付成功后,正式记录本次使用
LaravelDiscount::redeem($discount, $user, $result->discountAmount);

其中值得关注的是,redeem() 会在数据库事务中执行。因此,如果两名客户恰好同时争抢最后一个优惠券名额,最终只有一人能够成功,无需开发者自行编写锁定逻辑。

如果需要把更加复杂的折扣条件表示为可组合的 PHP 对象,Discountify 采用了这种方式,同样值得对比了解。

2. Laravel Truss 实时交互式数据库 ER 图

接手遗留项目时,面对包含数十张表、关系指向四面八方的数据库 Schema,很容易立即陷入迷茫。常见解决方式是打开外部数据库 GUI 客户端,或者请人使用白板工具重新绘制关系图。然而,只要运行一次新的迁移,这张图通常就会立即过时。

由 Alberto Arena 开发的 Laravel Truss 可以直接在浏览器中把数据库结构渲染成支持缩放和交互的 ER 图。该软件包只读取结构信息,包括表、字段、键和索引,绝不会访问实际的行数据。

Laravel Truss:实时数据库结构查看器。 它可以直接在 Laravel 应用中,以支持滚动和缩放的 ER 图展示数据库 Schema。

突出特性

  • 提供可平移和缩放的实时 ER 图。
  • 聚焦模式:隔离显示某张表及其关联表。
  • Schema 差异比较:查看自上次迁移以来发生了哪些变化。
  • Schema Doctor:标记缺少主键、外键未建立索引和重复索引等问题。
  • 支持多个数据库连接。
  • 可导出为 PNG、SVG、DBML、JSON、CSV、Mermaid 或 Markdown。

安装

建议将它作为开发依赖安装,因为默认情况下,相关路由只会在本地环境中启用:

bash
composer require albertoarena/laravel-truss --dev

安装完成后,在浏览器中访问 /truss,即可查看数据库 Schema 画布。

第一个示例通过 CLI 检查 Schema 变化:

bash
php artisan truss:diff

第二个示例运行 Schema 健康检查,非常适合加入 CI 流水线:

bash
php artisan truss:doctor

第三个示例把 Schema 导出为 DBML 格式,用作团队文档:

bash
php artisan truss:export --format=dbml --output=docs/schema.dbml

这项功能尤其值得关注:导出结果具有确定性。相同的 Schema 始终会生成完全相同的文件,因此可以在 CI 流水线中加入 --check 标志,确保 Schema 文档始终与最新迁移保持同步。

3. Saga Lara Flow 轻松管理长时间运行的工作流

这可能是本文五个软件包中最具突破性的一个。可以设想一项长时间运行的业务流程:先从信用卡扣款,再预留库存,最后安排发货。如果其中任何一步在中途失败,就必须手动回滚此前完成的步骤。这类代码通常会演变为混乱的任务链,或者难以阅读的状态机。

由 Andriy Karpishyn 开发的 Saga Lara Flow 允许开发者把整个长时间运行的流程编写成一个普通 PHP 方法,并运行在日常已经使用的 Laravel 队列之上。

Saga Lara Flow 简介: Saga Lara Flow 是一个构建于 Laravel 队列之上的工作流管理引擎,并集成了 Saga 模式。

突出特性

  • 工作流以普通 handle() 方法编写,无需建立任务链。
  • 补偿操作:为每个步骤注册一个“撤销”动作;如果后续步骤失败,系统会按照相反顺序自动回滚。
  • 信号:工作流可以暂停并等待外部输入,例如人工审批。
  • 并行区块:同时运行多个操作。
  • 子工作流:一个工作流可以在内部调用另一个工作流。

安装

bash
composer require discovery-ukraine/saga-lara-flow
php artisan migrate
php artisan vendor:publish --tag="saga-lara-flow-config"

第一个基础示例是账户配置工作流:

php
use DiscoveryUkraine\SagaLaraFlow\Workflow;

class ProvisionAccountWorkflow extends Workflow
{
    public function handle(string $email): array
    {
        $tenantId = $this->action(CreateTenant::class, $email)->run();
        $this->action(SendWelcomeEmail::class, $email)->run();
        return ['tenant' => $tenantId];
    }
}

第二个示例展示当某个步骤中途失败时,如何自动回滚事务:

php
public function handle(string $orderId): void
{
    $this->action(ChargeCard::class, $orderId)
        ->compensateWith(RefundCard::class, $orderId)
        ->run();

    $this->action(ReserveStock::class, $orderId)
        ->compensateWith(ReleaseStock::class, $orderId)
        ->run();

    // 如果这一行抛出异常,会先运行 ReleaseStock,再运行 RefundCard。
    $this->action(ShipOrder::class, $orderId)->run();
}

其底层设计十分巧妙:每个已经完成的步骤都会记录到数据库中。如果工作流重新运行,例如 Worker 重启之后,handle() 会从头再次执行,但任何此前已经成功的步骤都会跳过重复执行,系统会直接返回其已记录的结果。

该软件包要求 PHP 8.5 和 Laravel 13,因此在尝试之前,需要确保运行环境已经满足要求。

4. Laravel Head 轻松管理 Meta 标签

这是 Taylor Otwell 在 Laracon US 2026 主题演讲中亲自宣布的首批官方软件包之一。Laravel Head 解决了一个经典问题:管理标题、Meta Description、Canonical URL、Open Graph 标签和 JSON-LD。以往这些内容通常散落在数十个视图中,或者需要逐项手动处理。

GitHub - laravel/head: 用于 Laravel 应用的 Head 与元数据管理工具。

软件包提供的能力

  • 五层元数据优先级,从页面默认值到运行时元数据,每一层都会逐字段合并。
  • 通过 withHead() 方法设置路由级元数据。
  • 根据相同的标题和描述自动派生 Open Graph 和 X(Twitter)卡片。
  • 为文章、产品、面包屑导航和 FAQ 等 Schema 提供 JSON-LD 构建器。
  • 兼容 Blade、Livewire 和 Inertia。

安装

bash
composer require laravel/head

第一个示例在服务提供者中设置全站默认值:

php
use Laravel\Head\Facades\Head;
use Laravel\Head\HeadBuilder;
use Laravel\Head\Enums\OgType;

Head::defaults(function (HeadBuilder $head) {
    $head
        ->title('Developer Awam', suffix: ' - Developer Awam')
        ->description('Learn Laravel in a way that actually makes sense.')
        ->canonical()
        ->og(siteName: 'Developer Awam', type: OgType::Website)
        ->searchableByRobots();
});

第二个示例为每个页面动态设置元数据,例如文章详情页:

php
public function show(Post $post)
{
    Head::title($post->title)
        ->description($post->description)
        ->when($post->isDraft(), fn ($head) => $head->hiddenFromRobots());

    return view('posts.show', ['post' => $post]);
}

第三个示例把元数据直接绑定到路由,非常适合静态页面:

php
Route::view('/about', 'about')
    ->name('about')
    ->withHead(
        title: 'About Us',
        description: 'Get to know the team behind the scenes.',
    );

只需在 Blade 布局中加入 @head,所有已配置的内容就会自动渲染到 <head> 标签内。对于 Inertia 应用,serverHead 支持可以让元数据直接出现在初始 HTML 中,因此搜索引擎爬虫和链接预览机器人无须先运行 JavaScript 便可读取这些内容。

5. Laravel Doctor 为应用执行健康检查

最后一个官方软件包同样发布于 Laracon US 2026,它可能是本文中最适合日常使用的工具。Laravel Doctor 实际上把开发者调试时需要逐项确认的检查清单——APP_KEY 是否已设置、Storage 是否可写、队列连接是否正确配置——整合成一条可以随时运行的命令。

GitHub - laravel/doctor: Laravel 应用诊断工具。

检查内容

  • 环境.env 是否存在、APP_KEY、PHP 版本和必需扩展。
  • Composer:依赖是否已经安装、自动加载文件是否经过优化。
  • 配置:配置能否正确加载和缓存。
  • 数据库:连接是否可达、是否存在待执行的迁移。
  • 缓存、队列、调度器和 Session:已配置的驱动是否可达。
  • Storage:磁盘是否可写、storage:link 符号链接是否存在。
  • 安全:Debug 模式是否与环境匹配、.env 是否已被 Git 忽略。

安装

bash
composer require laravel/doctor --dev

第一个示例运行标准检查:

bash
php artisan doctor

第二个示例让 Doctor 自动修复可以安全处理的问题:

bash
php artisan doctor --fix

第三个示例把检查限制在特定分类中,例如安全检查:

bash
php artisan doctor --only=security

另一个值得关注的功能是,该软件包还为 AI 编码智能体提供了专用输出格式,例如 Claude Code 或 Cursor。因此,如果开发过程中使用了智能体,它可以在认为任务完成之前自动运行 artisan doctor,执行最终的合理性检查。第三方软件包也可以通过 Doctor Facade 注册自己的诊断项目,使 Laravel Doctor 不再只是静态工具,而是一个能够持续扩展的诊断平台。

总结与选择建议

如果暂时不确定应该首先尝试哪个软件包,可以参考以下简单建议:

  • 正在开发电商功能或需要优惠券系统——尝试 Laravel Discount。
  • 刚刚接手一个数据库结构混乱的项目——Laravel Truss 会非常实用。
  • 存在容易在中途失败的长时间业务流程——Saga Lara Flow 值得探索。
  • 厌倦了手动管理 SEO 标签——Laravel Head 可以简化这项工作。
  • 希望立即了解应用健康状况——运行 Laravel Doctor。

这五个软件包共同证明了一点:Laravel 生态系统从未停止前进。无论是社区开发的工具,还是核心团队发布的官方软件包,它们都源自开发者每天面对的真实问题。可以在下一个项目中尝试其中一个,亲自看看它能够节省多少时间。

本作品采用《CC 协议》,转载必须注明作者和本文链接