Lighthouse中GraphQL Enum无法设置null默认值的问题咨询
在Lighthouse中为枚举类型输入字段设置null默认值的问题解决
问题场景
在Lighthouse中定义并注册了PHP枚举类型:
<?php use GraphQL\Type\Definition\Description; #[Description(description: 'Size')] enum Size: string { case M = 'm'; case L = 'l'; }
通过服务提供者完成注册:
$typeRegistry->register(new PhpEnumType(Size::class));
尝试在GraphQL输入类型中为枚举字段设置null默认值:
input SomeInput { mySize: Size = null someOtherArgment: String = null }
调用对应突变时触发错误:
"message": "Undefined property: GraphQL\Language\AST\NullValueNode::$value", "exception": "ErrorException", "file": "/var/www/html/vendor/nuwave/lighthouse/src/Schema/AST/ASTHelper.php", "line": 166,
直接传入null值可正常工作,仅设置null为默认值时报错。
无需修改源码的替代方案
方案1:在业务逻辑中处理默认值
移除输入字段的默认值定义:
input SomeInput { mySize: Size someOtherArgment: String }
在处理输入的Resolver或业务代码中,判断字段是否存在,若不存在则手动设置为null:
// 示例Resolver逻辑 public function resolve($root, array $args) { $input = $args['input']; $input['mySize'] = $input['mySize'] ?? null; // 后续业务处理 }
方案2:自定义Lighthouse指令处理null默认值
创建自定义指令规避AST解析问题:
- 生成指令类:
<?php namespace App\GraphQL\Directives; use Nuwave\Lighthouse\Schema\Directives\BaseDirective; use Nuwave\Lighthouse\Schema\Values\FieldValue; use Nuwave\Lighthouse\Support\Contracts\FieldMiddleware; class DefaultNullDirective extends BaseDirective implements FieldMiddleware { public static function definition(): string { return /** @lang GraphQL */ <<<'GRAPHQL' directive @defaultNull on INPUT_FIELD_DEFINITION GRAPHQL; } public function handleField(FieldValue $fieldValue): void { $resolver = $fieldValue->getResolver(); $fieldValue->setResolver(function ($root, array $args) use ($resolver) { $inputName = $this->directiveArgValue('inputName') ?? 'input'; if (isset($args[$inputName]) && !array_key_exists($this->fieldName(), $args[$inputName])) { $args[$inputName][$this->fieldName()] = null; } return $resolver($root, $args); }); } }
- 在
config/lighthouse.php中注册指令:
'directives' => [ 'defaultNull' => \App\GraphQL\Directives\DefaultNullDirective::class, ],
- 在输入类型中使用指令:
input SomeInput { mySize: Size @defaultNull someOtherArgment: String @defaultNull }
是否属于Lighthouse的Bug
这确实是Lighthouse的AST解析逻辑Bug。NullValueNode作为GraphQL AST的节点类型,本身不包含$value属性,但ASTHelper.php第166行代码试图访问该属性,导致报错。你可以在Lighthouse的GitHub仓库提交Issue,描述问题及复现步骤,等待官方后续版本修复。
内容的提问来源于stack exchange,提问作者Arno van Oordt
相关产品推荐
相关产品推荐

