GraphQL API 与 PHP:分步教程

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为何 GraphQL 与 PHP 是绝佳组合

在 Web 开发领域,REST API 长期以来一直是事实上的标准。然而,随着应用日益复杂以及移动客户端的涌现,REST 的弊端逐渐显现:数据过度获取或获取不足、端点繁多、版本管理复杂。由 Facebook 开发的 GraphQL 通过允许客户端仅请求所需数据并在单次请求中获取,完美解决了这些问题。

尽管 PHP 常被贴上"老派"标签,它依然是构建服务端逻辑的强大语言。得益于 webonyx/graphql-php 等现代库,在 PHP 中实现 GraphQL API 已变得简单高效。在本教程中,我们将逐步构建一个功能完备的 GraphQL 服务器,使其能够处理查询、变更并与数据库交互。

我们将使用 PHP 8.0+、Composer 进行依赖管理,并利用 PHP 内置服务器进行本地测试。完成本文学习后,你将能够部署自己的 API,并将其与任意前端集成。



1. 环境搭建与配置

开始编码前,需要准备好项目环境。请确保已安装 PHP 8.0+ 和 Composer。创建一个新文件夹作为项目目录并进入:

mkdir graphql-php-tutorialcd graphql-php-tutorial

现在使用 Composer 安装核心库 webonyx/graphql-php:

composer require webonyx/graphql-php

我们将使用 PHP 内置的 PDO 进行数据库操作。另外安装一个用于便捷查询解析的库:

composer require graphql-php/graphql-php

创建 index.php 文件——这将是应用的入口点。设置 Composer 自动加载和基本结构:

<?phprequire_once __DIR__ . '/vendor/autoload.php';

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

// 我们的逻辑将在此处编写

同时创建 schema.graphql 文件用于存储文本格式的模式(可选,但在大型项目中非常实用)。



2. 定义模式与数据类型

任何 GraphQL API 的核心都是模式。它描述了哪些数据可用以及如何访问这些数据。在我们的示例中,将创建一个简单的用户和文章模型。

首先定义数据类型。在 index.php 文件中添加以下类:

// 用户类型$userType = new ObjectType([    'name' => 'User',    'fields' => [        'id' => Type::int(),        'name' => Type::string(),        'email' => Type::string(),        'posts' => [            'type' => Type::listOf($postType),            'resolve' => function ($user) use ($db) {                // 解析器函数:加载用户的所有文章                $stmt = $db->prepare('SELECT * FROM posts WHERE user_id = :id');                $stmt->execute([':id' => $user['id']]);                return $stmt->fetchAll(PDO::FETCH_ASSOC);            }        ]    ]]);

// 文章类型$postType = new ObjectType([ 'name' => 'Post', 'fields' => [ 'id' => Type::int(), 'title' => Type::string(), 'content' => Type::string(), 'author' => [ 'type' => $userType, 'resolve' => function ($post) use ($db) { $stmt = $db->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute([':id' => $post['user_id']]); return $stmt->fetch(PDO::FETCH_ASSOC); } ] ]]);

请特别关注 解析器——这些函数决定了如何获取每个字段的数据。在上述示例中,我们使用 PDO 进行数据库查询。

现在创建

博客

书籍推荐