4

I am trying to fetch person object by the example there: https://github.com/webonyx/graphql-php/tree/master/examples/01-blog

How should I debug this?

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);
    }

}

Query type:

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';
    }
}

I am sending query:

{
  person {
    id
  }
}

Why I am getting that error?

falinsky
  • 7,229
  • 3
  • 32
  • 56
Dariux
  • 3,953
  • 9
  • 43
  • 69

1 Answers1

6

While writing question and trying to minimize code, as often I found myself why I was getting the error:

It is becuase in QueryType.php __construct() function there is lines:

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

So the code requires that id would be passed, but we are not passing it. Our query should be like this:

{
  person(id: "1") {
    id

  }
}
Dariux
  • 3,953
  • 9
  • 43
  • 69