Lighthouse中如何无需自定义规则验证GraphQL枚举指定值?
问题场景
我在Lighthouse中定义了如下Size枚举:
<?php namespace App\Enums; use GraphQL\Type\Definition\Description; #[Description(description: 'Size')] enum Size: string { case S = 's'; case M = 'm'; case L = 'l'; case XL = 'xl'; }
并在服务提供者中完成注册:
$typeRegistry->register(new PhpEnumType(Size::class));
目前该枚举可正常使用。现在我希望在输入类型SomeInput的mySize字段中,仅允许L和XL两个枚举值,于是尝试使用如下GraphQL定义:
input SomeInput { mySize: Size @rules(apply: ["in:L,XL"]) }
但执行时报错:
"statusCode": 500, "debugMessage": "Object of class App\\Enums\\Size could not be converted to string", "file": "/var/www/html/vendor/laravel/framework/src/Illuminate/Validation/Concerns/ValidatesAttributes.php",
请问是否存在无需自定义规则即可实现该需求的方法?
解决方案
不需要自定义规则,有以下几种可行方式:
方法一:使用枚举的原始字符串值验证
Laravel的in规则接收的是字符串,但Lighthouse会把枚举值解析为枚举对象,所以直接用枚举对应的实际字符串值来验证即可:
input SomeInput { mySize: Size @rules(apply: ["in:l,xl"]) }
你的Size枚举是string类型,L对应的值是'l',XL对应'xl',用这些原始字符串就能匹配验证,不会触发类型转换错误。
方法二:在Schema层面用@enum指令限制可选值
直接在输入字段里定义仅包含L和XL的枚举子集,完全不需要依赖Laravel的验证规则,更贴合GraphQL类型系统的设计:
input SomeInput { mySize: @enum(values: ["L", "XL"]) }
这种方式会直接在Schema层面限制可选值,请求时传入其他枚举值会被GraphQL直接拦截,不会走到Laravel验证环节。
方法三:引用枚举类的常量值验证
如果想保持枚举case名称的可读性,可以在规则里直接引用枚举的常量值,利用Laravel验证规则支持解析类常量的特性:
input SomeInput { mySize: Size @rules(apply: ["in:" . App\\Enums\\Size::L->value . "," . App\\Enums\\Size::XL->value]) }
不过这种写法相对繁琐,推荐优先使用前两种方式。
内容的提问来源于stack exchange,提问作者Arno van Oordt
相关产品推荐
相关产品推荐

