在 Lighthouse 中我有一个像这样的枚举
<?php
use GraphQL\Type\Definition\Description;
#[Description(description: 'Size')]
enum Size: string
{
case M = 'm';
case L = 'l';
}
在服务提供商中我这样注册:
$typeRegistry->register(new PhpEnumType(StringSize::class));
在某些输入中我想像这样使用它:
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 并仅发送 null 作为值,则一切正常,因此枚举为 null
的事实不是问题,默认的 null
才是问题。
我调整了 Nuwave\Lighthouse\Schema\AST\ASTHelper.php,现在它看起来像这样:
// if ($argumentType instanceof EnumType) {
if ($argumentType instanceof EnumType && !($defaultValue instanceof NullValueNode)) {
assert($defaultValue instanceof EnumValueNode);
$internalValue = $argumentType->getValue($defaultValue->value);
assert($internalValue instanceof EnumValueDefinition);
return $internalValue->value;
}
这个简单的调整效果非常好,我现在可以将
null
设置为默认值,没有任何问题,但由于这需要我更改 Lighthouse 源代码,所以我想找到一个更好的替代方案。
有没有办法在不更改源代码的情况下将枚举的默认值设置为
null
,或者这只是 Lighthouse 中的一个错误?
在尝试了多种使用解析器和指令来规避该问题的可能性之后,我发现它们都不是简单的解决方案。
相反,我最终使用以下方法复制并覆盖 ASTHelper.php: 覆盖使用 Composer 安装的库中的类的策略
目前效果很好。只需要小心未来的任何 Lighthouse 更新