必须执行 php artisan pennant:install 并手动运行 php artisan migrate,否则 Feature::for($user)->active() 会因 features 表不存在而报错;还需验证数据库连接、确保服务提供者加载,并注意审计需自行监听事件或切换驱动。

直接用 composer require laravel/pennant 就能装上,但光执行这一步并不够——后续必须运行迁移和配置发布,否则 Feature::for($user)->active() 会报错或始终返回 false。
安装后必须立即执行 php artisan pennant:install
这是 Laravel Pennant 12+ 推荐的初始化方式(替代旧版的 vendor:publish + 手动迁移)。它会自动完成两件事:
- 发布
config/pennant.php配置文件 - 生成并注册
create_features_table迁移
如果你跳过这步,直接调用 Feature::for($user)->active('xxx'),会触发 SQLSTATE[42S02]: Base table or view not found: 1146 Table 'xxx.features' doesn't exist 错误。注意:该命令不会自动执行迁移,下一步还得手动跑 migrate。
php artisan migrate 前确认数据库连接正常
Pennant 默认使用 database 驱动,依赖 features 表。如果 .env 中 DB_CONNECTION 配置错误,或 MySQL/PostgreSQL 服务未启动,migrate 会失败,并卡在 Creating features table 步骤。常见现象:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
Illuminate\Database\QueryException : SQLSTATE[HY000] [1045] Access denied for user...PDOException::("SQLSTATE[HY000] [2002] Connection refused")
解决方法:先用 php artisan tinker 执行 DB::connection()->getPdo(); 验证连接;再检查 config/database.php 中对应连接器的 'prefix' => '' 是否被意外修改(Pennant 不支持表前缀)。
Blade 中用 @feature 指令前要确保已加载服务提供者
虽然 laravel/pennant 是 auto-discovered 包,但在某些自定义环境中(如禁用了包自动发现、或使用了 APP_ENV=testing 且未启用 PennantServiceProvider),@feature('new-ui') 会报 Undefined directive @feature。验证方式:
- 运行
php artisan package:discover --force - 检查
bootstrap/cache/packages.php是否包含"laravel/pennant" - 确认
config/app.php的providers数组中没有注释掉Laravel\Pennant\PennantServiceProvider::class
如果仍不生效,临时在 AppServiceProvider::boot() 里加一行 \Laravel\Pennant\BladeCompiler::registerDirectives(); 可绕过问题(仅调试用,勿留在线上)。
最常被忽略的是:Pennant 的 database 驱动默认把状态存进 features 表,但这个表不记录“谁在什么时候做了什么操作”。如果要做审计或灰度追踪,得自己监听 FeatureActivated/FeatureDeactivated 事件,或者改用 Redis 驱动配合 TTL 控制生命周期。


















