You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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兼容):

  1. 修改 composer.json 中的依赖:
{
    "require": {
        "league/fractal": "^0.20.0"
    }
}
  1. 执行更新命令:
composer update league/fractal

额外排查点

如果上述方案无效,检查以下内容:

  • 是否有其他Trait或者间接父类修改了属性类型
  • 确认代码开头是否开启了严格类型模式(declare(strict_types=1);),如果开启,要保证所有类型声明完全匹配父类

内容的提问来源于stack exchange,提问作者Muhammad Rashid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:00:57