不再害怕部署:Laravel Pennant 中的 Feature Flags
Source: Dev.to

合并冲突噩梦
在传统的 Git 工作流中,为 B2B SaaS 平台构建大型新功能的开发者通常会在一个单独的、长期存在的 feature branch 上工作数周。当功能准备就绪时,主生产分支已经完全改变。合并这个数周前的分支会导致灾难性的合并冲突、测试破坏以及巨大的部署焦虑。在 Smart Tech Devs,我们通过实践 Trunk‑Based Development 完全避免了这种情况。
Trunk‑based development 意味着开发者每天都将代码合并到主分支,即使功能尚未完成。我们如何在不破坏用户体验的情况下将未完成的代码部署到生产环境?我们使用 Feature Flags(功能标记)。
走进 Laravel Pennant
功能标记本质上是存储在数据库或 Redis 缓存中的动态布尔开关。它们包裹住新代码,使其对普通用户隐藏,仅对特定内部开发者或 beta 测试者可见。Laravel 为此提供了一个漂亮的官方包,叫 Laravel Pennant。
步骤 1:定义功能标记
首先,在服务提供者中定义我们的功能标记。假设我们正在构建一个全新的、重量级的 AI 分析仪表盘。
namespace App\Providers;
use App\Models\User;
use Illuminate\Support\ServiceProvider;
use Laravel\Pennant\Feature;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
// 定义标记:仅允许拥有 'admin' 角色的用户,
// 或者特定的早期访问 beta 租户看到新的 AI 仪表盘。
Feature::define('ai-analytics-v2', function (User $user) {
return $user->role === 'admin' || $user->tenant->in_beta_program;
});
}
}
步骤 2:控制 UI 和逻辑
现在,我们可以安全地将未完成的 AI 仪表盘代码部署到生产环境。我们在 Blade 模板(或 API 响应)中包裹 UI 链接,使 99 % 的用户永远看不到它。
// Inside a Laravel Controller
public function index(Request $request)
{
// 只有当该标记对当前用户激活时,代码才会执行
if (Feature::active('ai-analytics-v2')) {
return view('dashboard.ai-v2');
}
// 回退到稳定的、已有的生产仪表盘
return view('dashboard.v1');
}
工程回报率(ROI)
采用功能标记可以完全将 部署 与 发布 解耦。你可以一天部署十次代码,却不向公众发布任何新功能。如果新功能导致关键错误,你无需进行紧张的 Git 回滚和重新部署;只需将数据库中的开关切换为 false,功能即可在毫秒级消失。这是可扩展 SaaS 团队的终极安全网。