graphql php实现
GraphQL PHP 实现指南
安装依赖
使用 Composer 安装 webonyx/graphql-php 包:
composer require webonyx/graphql-php
定义 Schema
创建 GraphQL Schema,包含类型定义和查询/变更操作:
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\Type\Schema;
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'hello' => [
'type' => Type::string(),
'resolve' => function () {
return 'Hello World!';
}
]
]
]);
$schema = new Schema(['query' => $queryType]);
处理请求
接收 HTTP 请求并执行 GraphQL 查询:
use GraphQL\GraphQL;
use GraphQL\Error\FormattedError;
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
try {
$result = GraphQL::executeQuery($schema, $query);
$output = $result->toArray();
} catch (\Exception $e) {
$output = [
'errors' => [FormattedError::createFromException($e)]
];
}
header('Content-Type: application/json');
echo json_encode($output);
高级类型定义
定义自定义对象类型和复杂字段:
$userType = new ObjectType([
'name' => 'User',
'fields' => [
'id' => Type::id(),
'name' => Type::string(),
'email' => Type::string()
]
]);
$queryType->addField([
'name' => 'user',
'type' => $userType,
'args' => [
'id' => Type::nonNull(Type::id())
],
'resolve' => function ($root, $args) {
return getUserById($args['id']); // 实现数据获取逻辑
}
]);
变更操作
实现数据修改操作:
$mutationType = new ObjectType([
'name' => 'Mutation',
'fields' => [
'createUser' => [
'type' => $userType,
'args' => [
'name' => Type::nonNull(Type::string()),
'email' => Type::nonNull(Type::string())
],
'resolve' => function ($root, $args) {
return createNewUser($args); // 实现创建逻辑
}
]
]
]);
$schema = new Schema([
'query' => $queryType,
'mutation' => $mutationType
]);
数据加载优化
使用 DataLoader 解决 N+1 查询问题:
use GraphQL\Executor\Promise\Adapter\ReactPromiseAdapter;
use GraphQL\Executor\Promise\Promise;
$loader = new DataLoader(function ($keys) {
$users = batchLoadUsers($keys); // 批量加载逻辑
return new Promise(function ($resolve) use ($users) {
$resolve($users);
});
}, new ReactPromiseAdapter());
$userType->addField([
'name' => 'friends',
'type' => Type::listOf($userType),
'resolve' => function ($user) use ($loader) {
return $loader->load($user['friendIds']);
}
]);
错误处理
自定义错误格式和处理:
$result = GraphQL::executeQuery($schema, $query)
->setErrorFormatter(function (GraphQL\Error\Error $error) {
return [
'message' => $error->getMessage(),
'locations' => $error->getLocations(),
'code' => $error->getCode()
];
});
中间件支持
通过中间件处理请求:
$middleware = function ($schema, $query, $variables, $context) {
// 前置处理逻辑
$result = GraphQL::executeQuery($schema, $query, null, $context, $variables);
// 后置处理逻辑
return $result;
};
性能监控
添加查询复杂度分析:
use GraphQL\Validator\Rules\QueryComplexity;
use GraphQL\Validator\DocumentValidator;
$rule = new QueryComplexity(100); // 设置最大复杂度
DocumentValidator::addRule($rule);






