php graphQl“Field \”person \“argument \”id \“类型\”ID!\“是必需的但未提供。”,

时间:2017-01-21 09:04:27

标签: php graphql graphql-php

我试图通过那里的例子来获取人物对象:https://github.com/webonyx/graphql-php/tree/master/examples/01-blog

我该如何调试?

IndexController.php

    public function indexAction()
    {
        if (!empty($_GET['debug'])) {
            // Enable additional validation of type configs
            // (disabled by default because it is costly)
            Config::enableValidation();
            // Catch custom errors (to report them in query results if debugging is enabled)
            $phpErrors = [];
            set_error_handler(function($severity, $message, $file, $line) use (&$phpErrors) {
                $phpErrors[] = new ErrorException($message, 0, $severity, $file, $line);
            });
        }
        try {
           /* // Initialize our fake data source
            DataSource::init();*/
            // Prepare context that will be available in all field resolvers (as 3rd argument):
            $appContext = new AppContext();

            // here we can change to repository which returns user object
            //$appContext->viewer = DataSource::findUser('1'); // simulated "currently logged-in user"
            $appContext->rootUrl = 'http://localhost:8080';
            $appContext->request = $_REQUEST;
            // Parse incoming query and variables
            if (isset($_SERVER['CONTENT_TYPE']) && strpos($_SERVER['CONTENT_TYPE'], 'application/json') !== false) {
                $raw = file_get_contents('php://input') ?: '';
                $data = json_decode($raw, true);
            } else {
                $data = $_REQUEST;
            }
            $data += ['query' => null, 'variables' => null];
            if (null === $data['query']) {
                $data['query'] = '{hello}';
            }
            // GraphQL schema to be passed to query executor:
            $schema = new Schema([
                'query' => Types::query()
            ]);
            $result = GraphQL::execute(
                $schema,
                $data['query'],
                null,
                $appContext,
                (array) $data['variables']
            );
            // Add reported PHP errors to result (if any)
            if (!empty($_GET['debug']) && !empty($phpErrors)) {
                $result['extensions']['phpErrors'] = array_map(
                    ['GraphQL\Error\FormattedError', 'createFromPHPError'],
                    $phpErrors
                );
            }
            $httpStatus = 200;
        } catch (\Exception $error) {
            $httpStatus = 500;
            if (!empty($_GET['debug'])) {
                $result['extensions']['exception'] = FormattedError::createFromException($error);
            } else {
                $result['errors'] = [FormattedError::create('Unexpected Error')];
            }
        }
        header('Content-Type: application/json', true, $httpStatus);
        echo json_encode($result);
        die;
    }

PersonType.php

namespace Application\GraphQL\Type;

use Application\GraphQL\Types;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\ResolveInfo;

class PersonType extends ObjectType
{
    public function __construct()
    {
        $config = [
            'name' => 'Person',
            'description' => 'Persons',
            'fields' => function() {
                return [
                    'id' => Types::id(),
                    'firstName' => [
                        'type' => Types::string(),
                    ],
                ];
            },
            // todo what is this
            'interfaces' => [

                Types::node()
            ],
            'resolveField' => function($value, $args, $context, ResolveInfo $info) {
                if (method_exists($this, $info->fieldName)) {
                    return $this->{$info->fieldName}($value, $args, $context, $info);
                } else {
                    return $value->{$info->fieldName};
                }
            }
        ];
        parent::__construct($config);
    }

}

查询类型:

namespace Application\GraphQL\Type;


use Application\GraphQL\Types;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\ResolveInfo;
use GraphQL\Type\Definition\Type;

class QueryType extends ObjectType
{
    public function __construct()
    {
        $config = [
            'name' => 'Query',
            'fields' => [
                'person' => [
                    'type' => Types::person(),
                    'description' => 'Returns person by id',
                    'args' => [
                        'id' => Types::nonNull(Types::id())
                    ]
                ],
                'hello' => Type::string()
            ],
            'resolveField' => function($val, $args, $context, ResolveInfo $info) {
                return $this->{$info->fieldName}($val, $args, $context, $info);
            }
        ];
        parent::__construct($config);
    }

    public function person($rootValue, $args)
    {
        // todo ?
    }

    public function hello()
    {
        return 'Your graphql-php endpoint is ready! Use GraphiQL to browse API aaa';
    }
}

我发送查询:

{
  person {
    id
  }
}

为什么我收到错误?

1 个答案:

答案 0 :(得分:3)

在撰写问题并尝试最小化代码时,我经常发现自己为什么会收到错误:

因为在QueryType.php __construct()函数中有行:

'args' => [
                'id' => Types::nonNull(Types::id())
          ]

因此代码要求传递id,但我们没有传递它。我们的查询应该是这样的:

{
  person(id: "1") {
    id

  }
}