Laravel API 系列教程(四):基于 GraphQL 构建 Laravel API —— 基本使用篇 | 构建 API 接口:GraphQL | Laravel 入门到精通教程


本站和网页 https://xueyuanjun.com/post/9234.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Laravel API 系列教程(四):基于 GraphQL 构建 Laravel API —— 基本使用篇 | 构建 API 接口:GraphQL | Laravel 入门到精通教程
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Laravel 入门到精通教程
目录索引
开发环境篇
8篇文章
通过 Sail 构建基于 Docker 的 Laravel 本地集成开发环境
通过 Homestead 构建基于 Vagrant 的 Laravel 本地集成开发环境
通过 Valet 在 Mac 系统构建轻量级 Laravel 本地集成开发环境
Mac 系统为 Valet 开发环境安装指定版本 MySQL
在 Mac/Windows 系统中使用 Laradock 搭建基于 Docker 的 Laravel 开发环境
使用 Laragon 在 Windows 中快速搭建 Laravel 本地开发环境
使用 Visual Studio Code 作为 Laravel 开发工具
创建并运行一个新的 Laravel 项目
路由&控制器篇
5篇文章
Laravel 路由入门:路由定义、参数传递及路由命名
Laravel 路由分组规则:中间件、子域名、路由前缀和命名空间
Laravel 控制器:从 MVC 模式到资源控制器
路由进阶使用:模型绑定、兜底路由、频率限制和路由缓存
表单方法伪造与跨站请求伪造(CSRF)攻击防护
视图模板篇
4篇文章
视图入门:Laravel 支持的视图格式以及在路由中的基本使用
Blade 模板引擎入门篇:数据渲染 & 控制结构
Blade 模板引擎进阶篇:模板继承 & 组件引入
Blade 模板引擎高级篇:View Composer & 自定义指令
前端入门篇
3篇文章
在 Laravel 项目中使用 Bootstrap 框架
CSS 预编译语言 Sass 快速入门教程
在 Laravel 项目中编写第一个 Vue 组件
请求处理篇
5篇文章
通过 Request 对象实例获取用户请求数据
基于 Laravel + Vue 组件实现文件异步上传
在 Laravel 控制器中进行表单请求字段验证
通过表单请求类实现请求字段验证和错误提示
通过匿名函数和验证规则类自定义字段验证规则
命令行交互篇
3篇文章
在 Laravel 中编写第一个 Artisan 命令
在 Laravel 中编写高级的 Artisan 命令
通过 Tinker 实现 Laravel 命令行交互式 Shell
数据库与 Eloquent 模型
16篇文章
入门篇(一):数据库连接配置和读写分离
入门篇(二):通过迁移文件定义数据表结构
入门篇(三):通过填充器快速填充测试数据
入门篇(四):通过查询构建器实现简单的增删改查操作
进阶篇(一):通过查询构建器实现复杂的查询语句
进阶篇(二) —— 通过 Eloquent 模型实现简单增删改查操作
进阶篇(三):通过 Eloquent 模型实现批量赋值和软删除
进阶篇(四):在 Eloquent 模型类上设置访问器和修改器
进阶篇(五):在 Eloquent 模型类上使用全局作用域和局部作用域进行查询
进阶篇(六):Eloquent 模型事件和监听方式大全
进阶篇(七):Eloquent 模型关联关系(上)
进阶篇(八):Eloquent 模型关联关系(中)
进阶篇(九):Eloquent 模型关联关系(下)
结合 Bootstrap + Vue 组件在 Laravel 中实现异步分页功能
在 Laravel 中通过自定义分页器分页方法实现伪静态分页链接以利于 SEO
基于 Laravel + Vue 构建一个类似 Twitter 的 Web 应用
用户认证与授权
19篇文章
使用 Entrust 扩展包在 Laravel 5 中实现 RBAC 权限管理(一):安装配置篇
使用 Entrust 扩展包在 Laravel 5 中实现 RBAC 权限管理(二):使用篇
基于 Laravel Permission 扩展包在项目中轻松实现 RBAC 权限管理功能
通过内置脚手架快速实现用户认证
用户注册登录流程及多字段登录实现
基于多表的用户认证功能实现(前后台用户)
通过 Passport 实现 API 请求认证:单页面应用篇
通过 Passport 实现 API 请求认证:移动端应用篇(密码授权令牌)
通过 Passport 实现 API 请求认证:第三方应用篇(授权码获取令牌)
通过 Passport 实现 API 请求认证:开放平台篇(客户端凭证令牌)
通过 Passport 实现 API 请求认证:沙箱测试篇(私人访问令牌)
通过 Passport 实现 API 请求认证:隐式授权令牌
通过 Passport 实现 API 请求认证:令牌作用域详解
通过 Laravel 内置脚手架快速实现邮箱验证功能
通过监听注册登录、邮箱验证事件实现简单的积分功能
通过 Cookie 实现基于 Session 的单点登录
基于 CAS 实现通用的单点登录解决方案(一):CAS 原理及服务端搭建
基于 CAS 实现通用的单点登录解决方案(二):CAS 客户端搭建及单点登录测试
基于 CAS 实现通用的单点登录解决方案(三):用户单点退出实现
请求响应底层剖析
8篇文章
Laravel 底层是如何处理 HTTP 请求的
Laravel 请求类 Request 剖析
Laravel 响应类 Response 剖析
Laravel 中间件底层源码剖析
Laravel 路由匹配和执行底层源码剖析
异常处理篇之底层源码剖析
异常处理篇之异常信息报告、渲染及自定义处理
Laravel 框架如何基于 Composer 实现类和文件的自动加载
测试驱动开发
12篇文章
从基于 PHPUnit 编写单元测试开始
在 Laravel 中基于 PHPUnit 进行代码测试:目录结构及测试编排文件 phpunit.xml 详解
在 Laravel 中基于 PHPUnit 进行代码测试:单元测试篇
在 Laravel 中基于 PHPUnit 进行代码测试:HTTP 测试篇(上)
在 Laravel 中基于 PHPUnit 进行代码测试:HTTP 测试篇(下)
在 Laravel 中基于 Dusk 实现浏览器自动化测试快速入门
通过测试驱动开发构建待办任务项目(一):后端接口和功能测试篇
通过测试驱动开发构建待办任务项目(二):前端功能和浏览器测试篇
持续集成的定义和常用 CI 系统对比
基于 Github + CircleCI 实现 Laravel 项目的持续集成
基于 Github + Travis CI 实现 Laravel 项目的持续集成
基于 Coding + Jenkins 实现 Laravel 项目的持续集成
构建 API 接口:原生开发
5篇文章
编写 JSON API —— RESTful 风格 API 设计原则与最佳实践
编写 JSON API —— 基于资源控制器和 API 资源类快速构建 API 接口
Laravel API 系列教程(一): 基于 Laravel 5.5 构建 & 测试 RESTful API
Laravel API 系列教程(二): 结合 Laravel 5.5 和 Vue SPA 基于 jwt-auth 实现 API 认证
Laravel API 系列教程(三):使用 API Resource 来创建自己的 {JSON:API} 格式 API
构建 API 接口:GraphQL
6篇文章
Laravel API 系列教程(四):基于 GraphQL 构建 Laravel API —— 基本使用篇
Laravel API 系列教程(五):基于 GraphQL 构建 Laravel API —— 高级使用篇
解决前后端分离应用跨域请求利器 —— Laravel CORS 扩展包
基于 Laravel + Vue + GraphQL 实现前后端分离的博客应用(一) —— 用户注册登录
基于 Laravel + Vue + GraphQL 实现前后端分离的博客应用(二) —— 用户列表及详情页
基于 Laravel + Vue + GraphQL 实现前后端分离的博客应用(三) —— 文章发布及浏览
构建 API 接口:Dingo API
12篇文章
使用 Dingo API 快速构建 RESTful API(一)—— 安装配置篇
使用 Dingo API 快速构建 RESTful API(二)—— 编写第一个 API 接口
使用 Dingo API 快速构建 RESTful API(三)—— 返回基本 JSON 响应
使用 Dingo API 快速构建 RESTful API(四)—— 转化器篇(上):Fractal 简介及其使用入门
使用 Dingo API 快速构建 RESTful API(五)—— 转化器篇(下):结合响应构建器构建 JSON 响应
使用 Dingo API 快速构建 RESTful API(六)—— 转化器及响应构建器的高级使用
使用 Dingo API 快速构建 RESTful API(七)—— 错误及异常处理
使用 Dingo API 快速构建 RESTful API(八)—— API 认证实现(上)
使用 Dingo API 快速构建 RESTful API(九)—— API 认证实现(下)
使用 Dingo API 快速构建 RESTful API(十)—— 路由访问频率限制
使用 Dingo API 快速构建 RESTful API(十一)—— 在应用内部请求 Dingo API
使用 Dingo API 快速构建 RESTful API(十二)—— 生成 API 文档
构建 API 接口:生成 API 文档
3篇文章
使用 Laravel API 文档生成器扩展包自动为项目生成 API 文档
在 Laravel 中集成 API 文档生成器扩展包为 Dingo API 接口生成文档
在 Laravel 项目中集成 Swagger 扩展包为 Laravel API 生成接口文档并对接口进行测试
系统组件
4篇文章
基于 Laravel + Pusher + Vue 通过事件广播构建实时聊天室应用
由浅入深:基于 Laravel Broadcast 实现 WebSocket C/S 实时通信
基于迅搜(xunsearch) + Laravel Scout 实现 Laravel 学院全文搜索功能(支持多模型搜索)
基于七牛云 PHP SDK + Laravel 文件存储实现 Laravel 学院静态资源云存储及 CDN 加速
图书
Laravel 入门到精通教程
构建 API 接口:GraphQL
Laravel API 系列教程(四):基于 GraphQL 构建 Laravel API —— 基本使用篇
Laravel API 系列教程(四):基于 GraphQL 构建 Laravel API —— 基本使用篇
由 学院君 创建于4年前, 最后更新于 2年前
版本号 #3
32854 views
6 likes
2 collects
GraphQL 简介
GraphQL 是一个用于 API 的查询语言,同时也是一个通过为你的数据定义类型系统进行查询的服务端运行时。GraphQL 与数据库或任意存储引擎无关,仅仅是代码逻辑层面的查询实现。
通过 GraphQL,可以提高 API 调用的灵活性。我们可以在访问 API 时像编写数据库查询一样通过编写查询语句指定需要的数据,这在构建复杂 API 时很有用,GraphQL 已经提供了用户接口帮助来我们编写查询,此外,还提供了编写查询时自动提示的 UI 工具 —— GraphiQL,这些接口和工具可以极大提高查询编写效率。
GraphQL 与其说是一种语言,不如说是一种接口规范和风格,类似 REST,都是运行在业务逻辑层之上:
更多关于 GraphQL 的信息,请参考官方文档(英文吃力的同学可以看中文版)。
安装配置
GraphQL 为各大语言提供了 SDK,今天,我们的主题是基于 GraphQL 在 Laravel 中构建 API,需要通过相应的扩展包来实现。
我们还是在前面的 API 系列教程(系列一、系列二、系列三)基础之上进行开发,首先通过 Composer 安装扩展包:
composer require folklore/graphql
由于基于 Laravel 5.5 版本,所以无需手动注册服务提供者,接下来发布配置文件到 config 目录:
php artisan vendor:publish --provider="Folklore\GraphQL\ServiceProvider"
下面我们将以 User 模型为例简单演示下查询和更新操作 API 的构建。
创建 Query
GraphQL 基于类型进行操作,所以开始之前需要为 User 模型创建一个 UserType:
php artisan make:graphql:type UserType
生成的文件位于 app/GraphQL/Type 目录下,编写 UserType 类代码如下:
namespace App\GraphQL\Type;
use GraphQL\Type\Definition\Type;
use Folklore\GraphQL\Support\Type as BaseType;
use GraphQL;
class UserType extends BaseType
protected $attributes = [
'name' => 'User',
'description' => 'A User'
];
public function fields()
return [
'id' => [
'type' => Type::nonNull(Type::string()),
'description' => 'The id of the user'
],
'email' => [
'type' => Type::string(),
'description' => 'The email of the user'
];
protected function resolveEmailField($root, $args)
return strtolower($root->email);
然后在 config/graphql.php 中注册该类型:
'types' => [
'User' => \App\GraphQL\Type\UserType::class,
],
或者在服务提供者如 AppServiceProvider 的 boot 方法中新增下面这段代码,效果和在配置文件新增配置一样:
GraphQL::addType('App\GraphQL\Type\UserType', 'User');
定义好 UserType 之后,我们来编写查询实现,首先通过以下 Artisan 命令创建查询类:
php artisan make:graphql:query UserQuery
生成的文件位于 app/GraphQL/Query 目录下,编写 UserQuery 类代码如下:
namespace App\GraphQL\Query;
use App\User;
use Folklore\GraphQL\Support\Query;
use GraphQL\Type\Definition\Type;
use GraphQL;
class UserQuery extends Query
protected $attributes = [
'name' => 'users',
];
public function type()
return Type::listOf(GraphQL::type('User'));
public function args()
return [
'id' => ['name' => 'id', 'type' => Type::string()],
'email' => ['name' => 'email', 'type' => Type::string()]
];
public function resolve($root, $args)
if (isset($args['id'])) {
return User::where('id', $args['id'])->get();
} elseif (isset($args['email'])) {
return User::where('email', $args['email'])->get();
} else {
return User::all();
然后配置 config/graphql.php 新增查询结构:
'schemas' => [
'default' => [
'query' => [
'users' => \App\GraphQL\Query\UserQuery::class,
],
'mutation' => [
],
现在我们就可以通过接口访问用户数据了。可以通过 Postman 进行测试:
也可以通过 Chrome 浏览器扩展工具 GraphiQL 来测试(推荐使用这种方式):
创建 Mutation
一个简单的类比就是 Query 对应数据库的查询操作,Mutation 则对应数据库的变更操作。我们可以通过以下命令快速创建一个 Mutation 类:
php artisan make:graphql:mutation UpdateUserPasswordMutation
编辑新生成的 UpdateUserPasswordMutation 类:
namespace App\GraphQL\Mutation;
use App\User;
use Folklore\GraphQL\Support\Mutation;
use GraphQL\Type\Definition\Type;
use GraphQL;
class UpdateUserPasswordMutation extends Mutation
protected $attributes = [
'name' => 'updateUserPassword',
];
public function type()
return GraphQL::type('User');
public function args()
return [
'id' => ['name' => 'id', 'type' => Type::nonNull(Type::string())],
'password' => ['name' => 'password', 'type' => Type::nonNull(Type::string())]
];
public function resolve($root, $args)
$user = User::find($args['id']);
if (!$user) {
return null;
$user->password = bcrypt($args['password']);
$user->save();
return $user;
接下来配置 config/graphql.php 新增变更操作:
'schemas' => [
'default' => [
'query' => [
'users' => \App\GraphQL\Query\UserQuery::class,
],
'mutation' => [
'updateUserPassword' => \App\GraphQL\Mutation\UpdateUserPasswordMutation::class,
],
然后就可以在 GraphiQL 中进行变更密码测试了:
变更时进行字段验证
以更新用户邮箱为例,首先创建变更类:
php artisan make:graphql:mutation UpdateUserEmailMutation
然后编辑新生成的 UpdateUserEmailMutation 类:
namespace App\GraphQL\Mutation;
use App\User;
use Folklore\GraphQL\Support\Mutation;
use GraphQL\Type\Definition\Type;
use GraphQL;
class UpdateUserEmailMutation extends Mutation
protected $attributes = [
'name' => 'updateUserEmailMutation',
];
public function type()
return GraphQL::type('User');
public function args()
return [
'id' => ['name' => 'id', 'type' => Type::nonNull(Type::string())],
'email' => ['name' => 'email', 'type' => Type::nonNull(Type::string())]
];
public function rules()
return [
'id' => 'required',
'email' => ['required', 'email']
];
public function resolve($root, $args)
$user = User::find($args['id']);
if (!$user) {
return null;
$user->email = $args['email'];
$user->save();
return $user;
在配置文件 config/graphql.php 中新增变更配置:
'schemas' => [
'default' => [
'query' => [
'users' => \App\GraphQL\Query\UserQuery::class,
],
'mutation' => [
'updateUserPassword' => \App\GraphQL\Mutation\UpdateUserPasswordMutation::class,
'updateUserEmail' => \App\GraphQL\Mutation\UpdateUserEmailMutation::class,
],
最后在 GraphiQL 中进行变更邮箱测试,如果邮箱格式不正确的话会报错:
以上我们基于 GraphQL 实现了简单的模型查询和变更 API,并且实现了对变更字段的验证,这些都是最基本的应用示例,下一篇我们继续深入探讨基于 GraphQL 构建 Laravel API,包括参数查询、关联查询、自定义字段/接口、枚举以及接口认证等。
Laravel
查询
验证
API
5.5
GraphQL
Mutation
变更
GraphiQL
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
Laravel API 系列教程(三):使用 API Resource 来创建自己的 {JSON:API} 格式 API
>> 下一篇:
Laravel API 系列教程(五):基于 GraphQL 构建 Laravel API —— 高级使用篇
19 条评论
#11
学院君
评论于 4年前
正在删除评论...
这个可以通过定义返回类型来实现的 现在你定义的是返回list类型 后面博客应用中会讲到这块 留意下
#12
sinY
评论于 4年前
正在删除评论...
操作名称,当出问题的时候,可以通过名称来判断
#13
bigrocs
评论于 4年前
正在删除评论...
return Type::listOf(GraphQL::Type('Model'));
改成下面 nonNull就可以
return Type::nonNull(GraphQL::Type('Model'));
#14
大大小
评论于 4年前
正在删除评论...
使用graphQL的时候怎么做权限控制?
#15
musickr
评论于 4年前
正在删除评论...
学院君您好 我想问下前后端分离后 怎样去管理普通用户(前台注册)和管理员用户这两张表分开做认证该咋做啊
#16
学院君
评论于 4年前
回复 #15
正在删除评论...
这个Laravel 本身就支持啊:https://xueyuanjun.com/post/3502.html
#17
liukai
评论于 4年前
正在删除评论...
学习了 ?
#18
hebo5485
评论于 3年前
正在删除评论...
执行这里时出错:php artisan make:graphql:query UserQuery
报错如下:
There are no commands defined in the "make:graphql" namespace.
Did you mean this?
make
摸不着头脑
#19
栖枝
评论于 2年前
正在删除评论...
这个东西看起来只是方便了前端吧,对后端代码侵入太大了吧
&lsaquo;
&rsaquo;
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
GraphQL 简介
安装配置
创建 Query
创建 Mutation
变更时进行字段验证
相关推荐
Laravel API 系列教程(三):使用 API Resource 来创建自己的 {JSON:API} 格式 API
Laravel 入门到精通教程
构建 API 接口:原生开发
Laravel API 系列教程(五):基于 GraphQL 构建 Laravel API —— 高级使用篇
Laravel 入门到精通教程
构建 API 接口:GraphQL
基于 Laravel + Vue + GraphQL 实现前后端分离的博客应用(二) —— 用户列表及详情页
Laravel 入门到精通教程
构建 API 接口:GraphQL
基于 Laravel + Vue + GraphQL 实现前后端分离的博客应用(三) —— 文章发布及浏览
Laravel 入门到精通教程
构建 API 接口:GraphQL
新手求助,为什么我用 Request 请求类,对数据进行验证,无论对错然后他主动跳到欢迎页面?
问答
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助