
本文解决 Laravel 9 中使用 Psalm 进行静态分析时,自定义 Eloquent 工厂类(如 TripFactory)因泛型继承声明 @extends Factory 导致的模板参数类型错误(Psalm 错误码 183),核心方案是升级 Psalm 至 v4.30.0 或更高版本。
本文解决 laravel 9 中使用 psalm 进行静态分析时,自定义 eloquent 工厂类(如 `tripfactory`)因泛型继承声明 `@extends factory
在 Laravel 9+ 项目中,为提升类型安全性,开发者常通过 PHPDoc 声明工厂类的泛型约束,例如:
/**
* @extends Factory<trip>
*/
class TripFactory extends Factory
{
protected $model = Trip::class;
}</trip>
配合 Psalm 进行静态分析时,期望 TripFactory::new()->create() 能正确推断返回类型为 Trip,而非宽泛的 Model。但低版本 Psalm(如 v4.23.0)会报出如下错误:
InvalidTemplateParam - app/Domains/Trips/Seeders/TripSeeder.php:23:9 - Extended template param TModel of Illuminate\Database\Eloquent\Collection<int illuminate> expects type Illuminate\Database\Eloquent\Model, type int given</int>
该错误本质并非代码逻辑问题,而是 Psalm 在解析 Factory 基类的泛型模板(尤其是涉及 static 方法链式调用如 new()->create())时,对 static 上下文的类型推导存在缺陷。
✅ 根本解决方案:升级 Psalm 版本
此问题已在 Psalm v4.25.0 起逐步修复,并在 v4.30.0 及以上版本中稳定支持。关键改进来自 PR #8249,显著增强了跨类静态方法调用中 final static 类型的推理能力——这正是 Factory::new() 返回 static 实例、进而调用 create() 所依赖的核心机制。
请执行以下操作更新依赖:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
composer require --dev vimeo/psalm:^4.30 # 或直接升级至 Psalm v5(推荐长期维护项目): composer require --dev vimeo/psalm:^5.0
升级后,无需修改工厂类定义,上述泛型注解即可被正确识别,TripFactory::new()->create() 的返回类型将精准推断为 Trip,且集合操作(如 TripFactory::count(5)->create())也能获得正确的 Collection
⚠️ 注意事项
- 升级前建议运行 ./vendor/bin/psalm --update-baseline 以同步基准文件;
- 若项目已启用 --strict 模式,请检查是否引入新警告(通常为更精确的类型提示,属良性增强);
- Laravel 官方未在 Factory 基类中提供原生 PHP 8.1+ 泛型语法支持,因此当前仍需依赖 Psalm 的 PHPDoc 泛型解析能力,确保 @extends Factory
注解书写规范(尖括号内为具体模型类,非字符串)。
综上,保持 Psalm 版本及时更新,是保障 Laravel 高阶类型安全实践(如工厂泛型、查询构建器链式调用)顺利落地的关键前提。










