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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 02:00:06