2

您好我正在尝试创建一个返回 JSON 的解析器,我将此库与自定义标量一起使用https://github.com/mll-lab/graphql-php-scalars

我正在使用这样的 JSON 标量:

schema.graphql

input CustomInput {
    field1: String!
    field2: String!
}

type Mutation {
    getJson(data: CustomInput): JSON @field(resolver: "App\\GraphQL\\Mutations\\TestResolver@index")
}

测试解析器.php

public function index($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
{
   
    $data = array('msg'=>'hellow world', 'trueorfalse'=>true);
    return \Safe\json_encode($data);
    
}

GraphQL 游乐场

mutation{
 getJson(data: { field1: "foo", field2: "bar" })
}

------------ response------------
{
  "data": {
    "getJson": "\"{\\\"msg\\\":\\\"hello world\\\",\\\"trueorfalse\\\":true}\""
  }
}

如您所见,它返回一个字符串,而不是 JSON ......我做错了什么?

4

1 回答 1

6

你必须知道,你想收到什么作为回应。在解析器中,您必须返回一个数组,因此在您的示例中只需return $data.

那么问题来了,你期待什么...

  1. 您期望一个字符串化的 JSON。然后您可以使用来自的 JSON 标量定义mll-lab/grpahql-php-scalars
  2. 您期望 JS 对象方式的 JSON。然后你必须使用不同的 JSON Scalar 定义。你可以试试这个:https ://gist.github.com/lorado/0519972d6fcf01f1aa5179d09eb6a315

对您来说也是一个小改进:查询和突变不需要@field指令。如果您将字段的 CamelCased 名称放在特定的命名空间中,Lighthouse 可以自动为您找到解析器(App\GraphQL\Queries对于查询字段和App\GraphQL\Mutations突变字段。这些是默认值,您可以在配置中更改它们)。查看文档:https ://lighthouse-php.com/master/the-basics/fields.html#hello-world

所以对于你的例子,你可以简单地写

type Mutation {
    getJson(data: CustomInput): JSON
}
<?php

namespace App\GraphQL\Mutations;

class GetJson
{
    public function __invoke($rootValue, array $args, GraphQLContext $context, ResolveInfo $resolveInfo)
    {
        $data = array('msg'=>'hellow world', 'trueorfalse'=>true);
        return $data;
    }
}
于 2020-06-29T22:08:20.933 回答