与Laravel结合使用的GraphQL服务器已投入生产。
使用名为Lighthouse的库很容易构建。这就是我当时积累的知识。
https://github.com/nuwave/lighthouse
结论
- Laravel GraphQL非常适合Laravel的灵活性和GraphQL的鲁棒性。
- 如果您使用Laravel进行GraphQL,那么Lighthouse会很好
- 转储架构并与您的团队共享
在现实世界中使用GraphQL
我认为使用GraphQL的动机如下。
- 我想创建一个类型安全的Web API
- 我想弄清楚输入和输出
- 我想根据正在运行的代码清楚地在前台和服务器之间创建一个规范
但是,障碍是
- 我想重用现有服务的逻辑
- 我想逐步过渡。花三个月,很难
有一个
,我认为通常是与现有框架结合部分引入GraphQL的情况。让我们使用GraphQL作为新开发的API等。
在这种时候,开发资源通常很有限,因此我认为能够轻松创建GraphQL服务器很重要。
使用基于LarLL的基于LL的语言框架的原因也许是可以以较低的学习成本快速开发它们。按照团队的文化,将功能快速交付给用户可能更重要,因为可能存在一些错误,而不是随着时间的推移准确地执行。在这种情况下,如果花费大量时间编写GraphQL类型定义,将很难以团队形式采用它。
Lighthouse可以从类型定义中受益,同时花费最少的精力创建GraphQL服务器。让我们将其与其他GraphQL库进行比较。
将GraphQL与Laravel结合使用时的选择
- laravel-graphql
-
图ql-laravel
- 源自laravel-graphql,可用性几乎相同
- 灯塔
灯塔的特点
与其他两个库相比,它非常简单,可以像GraphQL一样编写。看起来像Node.js的Apollo-Server。
通过比较很容易理解。
简单类型定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | class UserType extends GraphQLType { protected $attributes = [ 'name' => 'User', 'description' => 'A user' ]; public function fields() { return [ 'id' => [ 'type' => Type::nonNull(Type::int()), 'description' => 'The id of the user' ], 'email' => [ 'type' => Type::string(), 'description' => 'The email of user' ], 'posts' => [ 'type' => Type::listOf(GraphQL::type('Post')), 'description' => 'The posts of user' ] ]; } protected function resolveEmailField($root, $args) { return strtolower($root->email); } } |
1 2 3 4 5 6 7 8 9 10 | type User { # The id of the user id: ID! # The email of user email: String # The posts of user posts: [Post!] @hasMany } |
您看到它变得非常简单了吗?
通过这种方式,它旨在读取和使用GraphQL文件。
顺便说一句,没有像
可以在GraphQL
中编写查询定义
配置/ graphql.php
1 2 3 4 5 6 7 8 9 10 | 'schemas' => [ 'default' => [ 'query' => [ 'users' => 'App\GraphQL\Query\UsersQuery' ], 'mutation' => [ 'updateUserEmail' => 'App\GraphQL\Query\UpdateUserEmailMutation' ] ], ], |
1 2 3 4 5 6 | type Query { users: [User] @field(resolver: "App\\GraphQL\\User@resolve") } type Mutation { updateUserEmail(email: String): User @field(resolver: "App\\GraphQL\\Query\\UpdateUserEmailMutation") } |
laravel-graphql是使用
就个人而言,我认为用
Lighthouse还可以读取其他
避免在获得关联时出现N 1问题
GraphQL Relation是一个令人头疼的问题,我认为解析查询并根据需要执行Eager Load是很常见的。当然,GraphQL-Rails似乎是当前情况,并且应该在以后进行改进。
https://github.com/Folkloreatelier/laravel-graphql/blob/develop/docs/advanced.md#eager-loading-relationships
1 2 3 4 5 6 7 8 9 10 11 12 13 | $fields = $info->getFieldSelection($depth = 3); $users = User::query(); foreach ($fields as $field => $keys) { if ($field === 'profile') { $users->with('profile'); } if ($field === 'posts') { $users->with('posts'); } } |
是的。每次查询时都这样做吗? GraphQL是什么意思?
Lighthouse为您做到了。如果指定
如果您遵循
代码,则看起来您正在使用
https://github.com/nuwave/lighthouse/blob/15e6681c0bf54c27641223c17d577040e2f1d4fa/src/Support/DataLoader/QueryBuilder.php#L90-L113
生成schema.graphql
Lighthouse提供了一个名为
使用GraphDoc之类的工具并将其输出到实时HTML文档会很好。
- https://github.com/2fd/graphdoc
-
https://2fd.github.io/graphdoc/pokemon/(演示)
此外,如果您在CI中生成这样的文档,将其存储为S3中的静态站点,并与前端工程师共享,那么您将拥有一个很酷的前端环境。
积极发展
此
https://github.com/Folkloreatelier/laravel-graphql/issues/270#issuecomment-397456932
在撰写本文时(2018年8月11日),Lighthouse是在一天前提交的,我们将很快收到对该问题的答复,因此我们可以在将来期待它。
例如,他对我发布的问题做出了适当的回应,并表示他希望将来将其合并。这让我印象深刻。
我将暂时保留此问题,作为讨论如何将策略应用于特定模型实例的基础。希望获得更多反馈/听到更多用例。
https://github.com/nuwave/lighthouse/issues/244
目前没有很多星星,所以它可能不是关注的焦点。
[添加]
撰写本文后八个月(2019年3月21日),它仍然处于活动状态,两天前提交了内容,并在Beta版中发布了ver 3。
当我查看时,Nuwave似乎是一家美国公司,正在围绕Laravel和GraphQL进行合同开发。难怪它提供了高质量的代码,活跃的开发,易于阅读的文档以及友好的社区。
完整说明文件
Lighthouse有其自己的存储库,非常易于阅读。
- https://github.com/nuwave/lighthouse-docs
- https://lighthouse-php.netlify.com/
另外,志愿者还有一个名为
https://github.com/nuwave/lighthouse/issues/106
但是,似乎没有赶上文档的导入,尽管有很多隐藏功能,但似乎它们没有反映在文档中。
如果要创建自己的指令,则必须阅读现有的源代码。就是说,它很容易阅读,因此您不会有太多麻烦。
概要
指令的混乱感觉可能是一种锁定的感觉,并且有些人不愿意,但是我不在乎,因为它看起来类似于Apollo和GraphQL-Ruby。
如果您喜欢精简框架或想要定义类似PHP的查询,则可能更喜欢
星星的数量仍然很少,但是我想注意它是一个图书馆。
我个人非常喜欢Lighthouse,以至于我称赞它,但是我希望更多的人会使用它。
如果有需求,我想知道是否可以制作一个教程。
顺便说说
如果您想使用Laravel GraphQL进行开发,我可以向您介绍https://lighthouse-php.com/users/上列出的公司,所以请让我知道-