引言:为何 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 进行数据库查询。
现在创建