PHP 8 中用 webonyx/graphql-php 实现 GraphQL 接口,需安装库、定义 Schema(如用户查询)、实现 Resolver,并通过 PSR-7 服务响应 POST JSON 请求。

PHP 8 编写 GraphQL 查询接口,核心是用 webonyx/graphql-php 库(官方推荐、最成熟)搭配 PSR-7 兼容的 HTTP 服务(如 Laravel、Slim 或纯 PHP + Relay),不依赖框架也能跑。重点在于定义 Schema、实现 Resolver,并正确响应 GraphQL 请求体(POST JSON)。
1. 安装依赖与基础环境准备
确保已安装 PHP 8.0+ 和 Composer:
- 运行
composer require webonyx/graphql-php - 可选但推荐:加
composer require nyholm/psr7(轻量 PSR-7 实现)和php-http/curl-client(用于测试或转发) - 不用框架时,用原生 PHP 启动简单服务(如
php -S localhost:8000 router.php)
2. 定义 GraphQL Schema(类型系统)
Schema 描述数据结构和查询能力。例如支持查用户列表和单个用户:
$typeDefs = <<<GRAPHQL
type User {
id: ID!
name: String!
email: String
}
type Query {
users: [User!]!
user(id: ID!): User
}
GRAPHQL;
然后用 GraphQL\Utils\BuildSchema::build($typeDefs) 解析成可执行 Schema 对象。
立即学习“PHP免费学习笔记(深入)”;
3. 实现 Resolver(数据获取逻辑)
Resolver 是函数,告诉 GraphQL “当用户请求某个字段时,怎么取数据”。例如:
$resolvers = [
'Query' => [
'users' => fn() => [
['id' => '1', 'name' => '张三', 'email' => 'zhang@example.com'],
['id' => '2', 'name' => '李四', 'email' => 'li@example.com'],
],
'user' => fn($root, array $args) => [
'id' => $args['id'],
'name' => '用户 ' . $args['id'],
'email' => $args['id'] . '@test.com',
],
],
];
注意:参数顺序为 ($root, $args, $context, $info),实际中常用 $args 取查询参数,$context 放 DB 连接或 Auth 用户。
4. 处理 HTTP 请求并执行查询
接收 POST 的 JSON 请求体(含 query、variables),调用 GraphQL\GraphQL::executeQuery():
- 从
php://input读取原始 JSON - 解码后提取
query字符串、variables数组(可为空) - 传入 Schema、query、resolvers、context(如 PDO 实例)执行
- 返回结果用
json_encode($result)输出,设Content-Type: application/json
示例查询:{"query":"{ users { id name } }"} → 返回标准 GraphQL JSON 响应格式(含 data 或 errors)。
5. 可选增强:使用类结构组织代码
大型项目建议拆分:
- 创建
UserType.php类继承ObjectType,封装字段定义 - 把 Resolver 写成独立类方法,通过
resolveField注册 - 用
GraphQL\Type\Schema构造器传入query类型实例 - 配合 PSR-11 容器管理依赖(如数据库连接注入到 Resolver)
这样更易维护、测试和扩展,也符合 PHP 8 的类型提示优势(如声明 function resolveUser(mixed $root, array $args): array)。
不复杂但容易忽略:GraphQL 接口必须严格处理 POST + JSON,不支持 GET 查询字符串(除非手动解析,不推荐);错误要按规范返回 errors 数组;开发阶段可加 GraphQL\Server\StandardServer 快速启用 GraphiQL 调试界面。



















