Laravel6.20+PHP8下UserTransformer::$availableIncludes类型错误
解决Laravel 6.20 + PHP 8 下 UserTransformer 类型不匹配错误:
Type of App\Transformers\User\UserTransformer::$availableIncludes must be array 问题原因
PHP 8 对类属性的类型声明要求更严格,而 League\Fractal 的 TransformerAbstract 父类中,$availableIncludes 属性的类型明确为 array。如果你的 UserTransformer 子类中,这个属性的类型声明和父类不一致(比如没指定类型、指定了其他类型,或者初始值不是数组),就会触发这个类型不匹配错误。
解决方案
1. 严格对齐父类属性类型
在 UserTransformer 类里,显式声明 $availableIncludes 为 array 类型,初始化为空数组(如果暂时没有需要预定义的关联包含项):
<?php namespace App\Transformers\User; use League\Fractal\TransformerAbstract; use App\Models\User; class UserTransformer extends TransformerAbstract { // 与父类保持一致,声明为array类型 protected array $availableIncludes = []; public function transform(User $user) { return [ 'id' => $user->id, 'name' => $user->name, 'email' => $user->email, // 其他需要返回的字段 ]; } // 示例:如果需要包含关联数据,比如用户的文章 public function includePosts(User $user) { return $this->collection($user->posts, new PostTransformer()); } }
2. 排查错误的类型声明
如果之前你给 $availableIncludes 写了错误的类型(比如 protected ?array $availableIncludes = null; 这种允许null的声明),或者赋值了非数组的初始值,直接修正为 array 类型即可。PHP8不允许子类属性的类型范围比父类更宽松。
3. 确认Fractal版本兼容性
Laravel 6.20 搭配的旧版Fractal可能对PHP8的类型支持不完善,可尝试更新到兼容PHP8的Fractal版本(比如 league/fractal:^0.20.0,注意要和Laravel 6.x兼容):
- 修改
composer.json中的依赖:
{ "require": { "league/fractal": "^0.20.0" } }
- 执行更新命令:
composer update league/fractal
额外排查点
如果上述方案无效,检查以下内容:
- 是否有其他Trait或者间接父类修改了属性类型
- 确认代码开头是否开启了严格类型模式(
declare(strict_types=1);),如果开启,要保证所有类型声明完全匹配父类
内容的提问来源于stack exchange,提问作者Muhammad Rashid
相关产品推荐
相关产品推荐

