如果您想使用Laravel进行GraphQL,Lighthouse很好


与Laravel结合使用的GraphQL服务器已投入生产。
使用名为Lighthouse的库很容易构建。这就是我当时积累的知识。

image.png

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。
通过比较很容易理解。

简单类型定义

laravel-graphql

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);
    }
}

lighthouse

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文件。

顺便说一句,没有像resolveEmailField这样的特定属性的解析器,它似乎是使用魔术方法解决的。在上面的示例中,它看起来像User#getEmailAttribute

可以在GraphQL

中编写查询定义

laravel-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'
        ]
    ],
],

lighthouse

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是使用configGraphQL::addSchema('users', ...外观的一种选择,并且Lighthouse是在graphql文件中指定的。

就个人而言,我认为用config编写的外观与外观有所不同,如果可能的话,我想在GraphQL中对其进行定义。

Lighthouse还可以读取其他graphql文件,因此拆分很容易,您可以一目了然地看到查询接收和返回的内容。

避免在获得关联时出现N 1问题

GraphQL Relation是一个令人头疼的问题,我认为解析查询并根据需要执行Eager Load是很常见的。当然,GraphQL-Rails似乎是当前情况,并且应该在以后进行改进。

laravel-graphql也是一样,并且该文档显示了一个实际的代码示例。

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为您做到了。如果指定@hasMany指令,它将自动解决关系并发出查询以解决N 1问题。太奇妙了。

如果您遵循

代码,则看起来您正在使用Union查询。实际上,SQL日志就是这种情况。

https://github.com/nuwave/lighthouse/blob/15e6681c0bf54c27641223c17d577040e2f1d4fa/src/Support/DataLoader/QueryBuilder.php#L90-L113

生成schema.graphql

Lighthouse提供了一个名为php artisan lighthouse:print-schema的命令,该命令可以输出模式。

使用GraphDoc之类的工具并将其输出到实时HTML文档会很好。

  • https://github.com/2fd/graphdoc
  • https://2fd.github.io/graphdoc/pokemon/(演示)

此外,如果您在CI中生成这样的文档,将其存储为S3中的静态站点,并与前端工程师共享,那么您将拥有一个很酷的前端环境。

laravel-graphql目前似乎没有命令来转储架构。

积极发展

laravel-graphql问题已近3个月未更新,因此使用Lighthouse是一个好主意。我也看到了此线程并进行了迁移。 (这很困难,因为它是项目的后半部分)

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进行合同开发。难怪它提供了高质量的代码,活跃的开发,易于阅读的文档以及友好的社区。

完整说明文件

laravel-graphql有一个相对简单的文档。在文档方面,实际上有两个Readme.md和docs / advanced.md副本。

Lighthouse有其自己的存储库,非常易于阅读。

  • https://github.com/nuwave/lighthouse-docs
  • https://lighthouse-php.netlify.com/

另外,志愿者还有一个名为How do I...的问题,在这种情况下您应该怎么做?信息收集。这很有帮助。

https://github.com/nuwave/lighthouse/issues/106

但是,似乎没有赶上文档的导入,尽管有很多隐藏功能,但似乎它们没有反映在文档中。

如果要创建自己的指令,则必须阅读现有的源代码。就是说,它很容易阅读,因此您不会有太多麻烦。

概要

指令的混乱感觉可能是一种锁定的感觉,并且有些人不愿意,但是我不在乎,因为它看起来类似于Apollo和GraphQL-Ruby。

如果您喜欢精简框架或想要定义类似PHP的查询,则可能更喜欢laravel-graphql,但是使用Laravel时感觉就像是一个锁定???是吗?是OSS。

星星的数量仍然很少,但是我想注意它是一个图书馆。

我个人非常喜欢Lighthouse,以至于我称赞它,但是我希望更多的人会使用它。

如果有需求,我想知道是否可以制作一个教程。

顺便说说

如果您想使用Laravel GraphQL进行开发,我可以向您介绍https://lighthouse-php.com/users/上列出的公司,所以请让我知道-