GraphQL在PHP中的应用:webonyx/graphql-php库用于创建API

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

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

开始课程

PHP的GraphQL库:webonyx/graphql-php



在现代Web开发中,对灵活高效API的需求日益增长。传统的REST服务常常面临数据加载过多或不足的问题。GraphQL 是一种由Facebook创建的查询语言和执行环境,它允许客户端精确请求所需的数据。对于PHP来说,最流行的实现之一就是 webonyx/graphql-php 库。



该库提供了一套完整的工具,用于在PHP上构建GraphQL服务器:从类型模式定义到处理包含嵌套关系的复杂查询。它非常适合为Web应用、移动应用和SPA(单页应用)创建现代API。



webonyx/graphql-php 的主要功能



  • 完全支持GraphQL规范(2018年6月版)——所有类型、指令、变量和片段。
  • 基于PHP对象的类型系统——定义类型、接口、联合类型和枚举。
  • 内置解析器——能够为每个字段定义数据获取逻辑。
  • 查询验证——自动检查语法和类型。
  • 支持延迟加载——数据仅在请求时加载。
  • 与流行框架兼容——通过封装包支持Laravel、Symfony、Yii2。


安装与配置



通过Composer进行安装:



composer require webonyx/graphql-php


运行需要PHP 7.1+并安装 mbstring 扩展。安装完成后,我们来创建一个简单的服务器。



示例:创建GraphQL模式



我们来看一个基本示例——获取书籍和作者列表。首先定义类型:



<?phpuse GraphQL\\Type\\Definition\\ObjectType;use GraphQL\\Type\\Definition\\Type;use GraphQL\\Type\\Schema;

// "Author" 类型$authorType = new ObjectType([ 'name' => 'Author', 'fields' => [ 'id' => Type::int(), 'name' => Type::string(), 'books' => [ 'type' => Type::listOf($bookType), // 将在下面定义 'resolve' => function ($author) { // 假设有一个 getBooksByAuthorId() 函数 return getBooksByAuthorId($author['id']); } ] ]]);

// "Book" 类型(使用闭包定义以处理循环引用)$bookType = new ObjectType([ 'name' => 'Book', 'fields' => function() use ($authorType) { return [ 'id' => Type::int(), 'title' => Type::string(), 'author' => [ 'type' => $authorType, 'resolve' => function ($book) { return getAuthorById($book['author_id']); } ] ]; }]);

// "Query" 类型$queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'books' => [ 'type' => Type::listOf($bookType), 'resolve' => function() { return getAllBooks(); } ], 'author' => [ 'type' => $authorType, 'args' => [ 'id' => Type::nonNull(Type::int()) ], 'resolve' => function($root, $args) { return getAuthorById($args['id']); } ] ]]);

// 创建模式$schema = new Schema([ 'query' => $queryType]);


处理查询



现在编写接收GraphQL查询并返回结果的代码:



<?phpuse GraphQL\\GraphQL;use GraphQL\\Error\\DebugFlag;

// 从输入中获取请求体

推荐