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

PHP Lighthouse自定义@round指令疑问:Resolver为何接收全字段值

解决GraphQL @round指令resolveField中$value返回父对象的问题

你遇到的不是操作错误,这是GraphQL字段级指令执行的正常特性:字段指令的resolve函数默认接收的是父对象的解析结果,而非当前字段的原始值。下面是具体的解决思路和代码示例:

核心解决步骤

  1. 先调用原始字段解析器获取当前字段值
    不要直接从$value里提取字段值(比如$value['sum']),因为如果父字段有自定义解析逻辑,直接取可能拿到未处理的原始数据。正确的做法是先触发原始字段的解析,拿到最终值后再做四舍五入:

    public function resolveField(FieldResolver $fieldResolver): FieldResolver
    {
        return function ($value, array $args, $context, ResolveInfo $info) use ($fieldResolver) {
            // 先执行原始字段解析器,拿到sum字段的真实值
            $originalSumValue = $fieldResolver->__invoke($value, $args, $context, $info);
            // 从指令配置中获取精度,默认2位
            $precision = $this->config['precision'] ?? 2;
            // 执行四舍五入并返回
            return round($originalSumValue, $precision);
        };
    }
    
  2. 确认指令的绑定位置
    确保你的@round指令是绑定在单个字段上,而非整个类型。SDL定义要符合以下格式:

    type StatsPriceOutput {
      count: Int!
      sum: Float! @round(precision: 4)
    }
    

为什么会拿到父对象?

GraphQL的解析流程是从根字段开始,逐层解析父对象,再依次解析子字段。当你给字段添加指令时,指令的resolve函数会包裹原始字段的解析器,此时第一个参数$value就是父对象的解析结果——你必须先调用原始解析器,才能获取当前字段的最终值。

内容的提问来源于stack exchange,提问作者Kipras Bielinskas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:57:09