GraphQL API 与 PHP:面向初学者的分步教程

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

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

开始课程

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;

博客

书籍推荐