GraphQL 和 PHP 简介
GraphQL 是一种用于 API 的查询语言,也是一个用于使用现有数据执行这些查询的运行时。与 REST 不同,在 REST 中您会获得固定的响应结构,而 GraphQL 允许客户端只请求其真正需要的数据。这使得 API 更加灵活和高效。
在本教程中,我们将从零开始使用 PHP 创建一个简单的 GraphQL API。您将学习如何安装必要的库、定义模式、编写解析器以及处理查询。本文面向熟悉 PHP 和数据库(例如 MySQL 或 SQLite)基础的初级开发人员。
我们将使用 webonyx/graphql-php 库——这是在 PHP 上实现 GraphQL 最流行且最稳定的包。最后,您将能够启动自己的 GraphQL 服务器,并通过任何 HTTP 客户端(例如 cURL 或 Insomnia)向其发送查询。
项目安装与配置
步骤 1:创建项目并安装依赖
首先,为项目创建一个新目录并初始化 Composer:
mkdir graphql-php-tutorialcd graphql-php-tutorialcomposer init然后安装 webonyx/graphql-php 库:
composer require webonyx/graphql-php我们还需要一个兼容 PSR-7 的 HTTP 服务器。为简单起见,我们将使用内置的 PHP 服务器和 guzzlehttp/psr7 库来处理请求和响应:
composer require guzzlehttp/psr7步骤 2:项目结构
创建以下文件结构:
index.php— 应用程序入口点schema.graphql— 定义 GraphQL 模式的文件resolvers.php— 包含解析器函数的文件data.php— 模拟数据库(包含数据的数组)
定义 GraphQL 模式
步骤 3:编写模式
模式是对数据类型和可用操作(查询和变更)的描述。让我们创建一个简单的模式来管理书籍列表。打开 schema.graphql 文件并粘贴以下代码:
type Book { id: ID! title: String! author: String! year: Int}
type Query { books: [Book] book(id: ID!): Book}
type Mutation { addBook(title: String!, author: String!, year: Int): Book deleteBook(id: ID!): Book}这里我们定义了:
- Book — 包含 id、title、author 和 year 字段的数据类型。
- Query — 用于获取数据的操作:所有书籍的列表和按 ID 查询书籍。
- Mutation — 用于修改数据的操作:添加和删除书籍。
步骤 4:准备数据和解析器
创建 data.php 文件,包含书籍数组:
<?php$books = [ 1 => ['id' => 1, 'title' => '战争与和平', 'author' => '列夫·托尔斯泰', 'year' => 1869], 2 => ['id' => 2, 'title' => '罪与罚', 'author' => '费奥多尔·陀思妥耶夫斯基', 'year' => 1866],];现在在 resolvers.php 文件中编写解析器。解析器是为模式中每个字段返回数据的函数。
<?phprequire 'data.php';
function resolveBooks() { global $books; return array_values($books);}
function resolveBook($root, $args) { global $books; return $books[$args['id']] ?? null;}
function resolveAddBook($root, $args) { global $books; $newId = count($books) + 1; $newBook = [ 'id' => $newId, 'title' => $args['title'], 'author' => $args['author'], 'year' => $args['year'] ?? null ]; $books[$newId] = $newBook; return $newBook;}
function resolveDeleteBook($root, $args) { global $books;