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
相关产品推荐
相关产品推荐

