跳到主要内容

PHP GraphQL API

GraphQL 是一种用于 API 的查询语言,它允许客户端请求所需的数据,而不是像 REST API 那样返回固定的数据结构。PHP 是一种广泛使用的服务器端脚本语言,结合 GraphQL 可以构建灵活且高效的 API。本文将带你从零开始学习如何使用 PHP 构建 GraphQL API。

什么是 GraphQL?

GraphQL 是由 Facebook 开发的一种查询语言,用于 API 的数据查询和操作。与 REST API 不同,GraphQL 允许客户端指定需要的数据结构,从而减少了不必要的数据传输。GraphQL 的核心特性包括:

  • 强类型系统:GraphQL 使用类型系统定义数据结构。
  • 单一端点:所有请求都发送到同一个端点。
  • 灵活的查询:客户端可以精确请求所需的数据。

为什么使用 GraphQL?

  • 减少请求次数:通过一次请求获取多个资源。
  • 减少数据传输:只返回客户端需要的数据。
  • 强类型系统:提供更好的开发工具和错误检查。

设置 PHP GraphQL 环境

要开始使用 PHP 构建 GraphQL API,首先需要安装一些必要的依赖项。我们将使用 webonyx/graphql-php 库,这是一个流行的 PHP GraphQL 实现。

安装依赖

使用 Composer 安装 webonyx/graphql-php

bash
composer require webonyx/graphql-php

创建 GraphQL 服务器

接下来,创建一个简单的 GraphQL 服务器。首先,创建一个 schema.php 文件来定义 GraphQL 模式。

php
<?php

use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\Type\Schema;
use GraphQL\GraphQL;

$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'hello' => [
'type' => Type::string(),
'resolve' => function () {
return 'Hello, World!';
},
],
],
]);

$schema = new Schema([
'query' => $queryType,
]);

$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];

$result = GraphQL::executeQuery($schema, $query);
echo json_encode($result);

运行 GraphQL 服务器

将上述代码保存为 schema.php,然后在终端中运行 PHP 内置服务器:

bash
php -S localhost:8000 schema.php

现在,你可以通过向 http://localhost:8000 发送 POST 请求来查询 GraphQL API。

定义 GraphQL 类型

GraphQL 使用类型系统来定义数据结构。以下是一个简单的类型定义示例:

php
$userType = new ObjectType([
'name' => 'User',
'fields' => [
'id' => [
'type' => Type::nonNull(Type::int()),
],
'name' => [
'type' => Type::string(),
],
'email' => [
'type' => Type::string(),
],
],
]);

查询和变更

GraphQL 支持两种主要操作:查询(Query)和变更(Mutation)。查询用于获取数据,而变更用于修改数据。

查询示例

以下是一个简单的查询示例,用于获取用户信息:

graphql
{
user(id: 1) {
id
name
email
}
}

变更示例

以下是一个简单的变更示例,用于创建新用户:

graphql
mutation {
createUser(name: "John Doe", email: "john@example.com") {
id
name
email
}
}

实际案例:博客系统

让我们通过一个实际的案例来展示如何使用 PHP 和 GraphQL 构建一个简单的博客系统。

定义类型

首先,定义 PostUser 类型:

php
$postType = new ObjectType([
'name' => 'Post',
'fields' => [
'id' => [
'type' => Type::nonNull(Type::int()),
],
'title' => [
'type' => Type::string(),
],
'content' => [
'type' => Type::string(),
],
'author' => [
'type' => $userType,
'resolve' => function ($post) {
return getUserById($post['authorId']);
},
],
],
]);

$userType = new ObjectType([
'name' => 'User',
'fields' => [
'id' => [
'type' => Type::nonNull(Type::int()),
],
'name' => [
'type' => Type::string(),
],
'email' => [
'type' => Type::string(),
],
'posts' => [
'type' => Type::listOf($postType),
'resolve' => function ($user) {
return getPostsByUserId($user['id']);
},
],
],
]);

查询和变更

接下来,定义查询和变更:

php
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'post' => [
'type' => $postType,
'args' => [
'id' => [
'type' => Type::nonNull(Type::int()),
],
],
'resolve' => function ($root, $args) {
return getPostById($args['id']);
},
],
'user' => [
'type' => $userType,
'args' => [
'id' => [
'type' => Type::nonNull(Type::int()),
],
],
'resolve' => function ($root, $args) {
return getUserById($args['id']);
},
],
],
]);

$mutationType = new ObjectType([
'name' => 'Mutation',
'fields' => [
'createPost' => [
'type' => $postType,
'args' => [
'title' => [
'type' => Type::nonNull(Type::string()),
],
'content' => [
'type' => Type::nonNull(Type::string()),
],
'authorId' => [
'type' => Type::nonNull(Type::int()),
],
],
'resolve' => function ($root, $args) {
return createPost($args['title'], $args['content'], $args['authorId']);
},
],
],
]);

运行博客系统

将上述代码保存为 schema.php,然后运行 PHP 内置服务器:

bash
php -S localhost:8000 schema.php

现在,你可以通过发送 GraphQL 查询和变更来管理博客系统中的帖子和用户。

总结

通过本文,你已经学习了如何使用 PHP 构建 GraphQL API。我们从基础概念开始,逐步讲解了如何定义类型、查询和变更,并通过一个实际的博客系统案例展示了 GraphQL 的强大功能。

提示

如果你想进一步学习 GraphQL,可以尝试以下练习:

  1. 扩展博客系统,添加评论功能。
  2. 实现用户认证和授权。
  3. 使用 GraphQL 订阅功能实现实时更新。

附加资源

希望本文能帮助你顺利入门 PHP GraphQL API 开发!