当前位置:首页 > PHP

graphql php实现

2026-02-28 12:56:28PHP

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

性能监控

添加查询复杂度分析:

graphql php实现

use GraphQL\Validator\Rules\QueryComplexity;
use GraphQL\Validator\DocumentValidator;

$rule = new QueryComplexity(100); // 设置最大复杂度
DocumentValidator::addRule($rule);

标签: graphqlphp
分享给朋友:

相关文章

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移除…

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php实现https

php实现https

PHP 实现 HTTPS 请求 在 PHP 中实现 HTTPS 请求,可以通过多种方式完成,包括使用内置函数、cURL 扩展或第三方库。以下是几种常见的方法: 使用 file_get_content…