我试图通过那里的例子来获取人对象: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 } }
为什么我会收到该错误?
在编写问题并尝试最小化代码时,我经常发现自己为什么得到错误:
这是因为QueryType.php __construct()函数中包含以下行:
'args' => [ 'id' => Types::nonNull(Types::id()) ]
因此代码要求传递id,但我们没有传递它。我们的查询应如下所示:
{ person(id: "1") { id } }