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

Laravel集成Lighthouse GraphQL时非根字段解析$version为空问题

排查Lighthouse GraphQL非根字段解析时父对象为null的问题

以下是针对该问题的具体排查步骤:

1. 确认根查询解析器的返回类型

根Query的version字段解析器必须返回Version模型的实例,而非数组或其他类型。如果返回数组,Lighthouse无法识别父对象类型,会导致子字段解析时无法传递正确参数。

正确示例:

// App/GraphQL/Resolvers/QueryResolver.php
use App\Models\Version;

public function version(): Version
{
    return new Version();
}

错误示例(会导致子字段解析器参数为null):

public function version(): array
{
    $composer = json_decode(file_get_contents(base_path('composer.json')), true);
    return [
        'appVersion' => $composer['version'],
        'apiVersion' => env('API_VERSION')
    ];
}

2. 检查Version类型的字段解析器绑定

确保schema中Version类型的字段正确关联了解析器,且命名规则匹配:

方式1:显式指定解析器

# graphql/schema.graphql
type Query {
    version: Version @field(resolver: "App\\GraphQL\\Resolvers\\QueryResolver@version")
}

type Version {
    appVersion: String @field(resolver: "App\\GraphQL\\Resolvers\\VersionResolver@appVersion")
    apiVersion: String @field(resolver: "App\\GraphQL\\Resolvers\\VersionResolver@apiVersion")
}

方式2:使用默认命名规则

如果不手动指定@field指令,Lighthouse会自动匹配App\\GraphQL\\Resolvers\\VersionResolver中的同名方法(比如appVersion方法对应appVersion字段),需确保解析器类和方法名正确。

3. 验证子字段解析器的参数签名

子字段解析器的第一个参数必须正确声明为Version模型类型,否则Laravel依赖注入无法解析父对象,导致参数为null:

正确示例:

// App/GraphQL/Resolvers/VersionResolver.php
use App\Models\Version;

class VersionResolver
{
    public function appVersion(Version $version): string
    {
        return $version->export()['appVersion'];
    }

    public function apiVersion(Version $version): string
    {
        return $version->export()['apiVersion'];
    }
}

注意:如果参数类型声明错误(比如写成array $version),会直接导致$version为null。

4. 清除Lighthouse缓存

缓存可能导致schema或解析器绑定不生效,运行以下命令清除缓存:

php artisan lighthouse:clear-cache

5. 检查Version模型的初始化逻辑

确保Version模型的构造方法正确读取composer.json数据并初始化属性:

// App/Models/Version.php
class Version extends Model
{
    protected $appVersion;
    protected $apiVersion;

    public function __construct(array $attributes = [])
    {
        parent::__construct($attributes);
        $composerData = json_decode(file_get_contents(base_path('composer.json')), true);
        $this->appVersion = $composerData['version'] ?? 'unknown';
        $this->apiVersion = env('API_VERSION', '1.0.0');
    }

    public function export(): array
    {
        return [
            'appVersion' => $this->appVersion,
            'apiVersion' => $this->apiVersion,
        ];
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:25:20