guym4c / doctrine-graphql-helper
从 Doctrine 实体生成 GraphQL 模式的辅助包
Requires
- php: ^7.4
- ecodev/graphql-doctrine: ^6.1
- league/container: ^3.2
- myclabs/php-enum: ^1.6
- webonyx/graphql-php: ^0.13.0
README
通过几行 PHP 代码,从 Doctrine ORM 实例生成 PSR-7 GraphQL API 服务器,并提供权限和自定义突变解析器。
安装
通过 Composer
composer install guym4c/doctrine-graphql-helper
使用方法
此包是 graphql-php
和 graphql-doctrine
的辅助包,它们会自动与它一起安装。使用此包的实体必须与 graphql-doctrine
兼容。有关更多详细信息,请参阅这些包的文档。
实现 GraphQLEntity
您希望在 API 中使用的任何实体都必须扩展 GraphQLEntity
并实现所需的方法。
您可能不希望您实现的方法被 graphql-doctrine
添加到模式中,因此您必须将它们注释为排除
use GraphQL\Doctrine\Annotation as API; /** * @API\Exclude */ public function someMethod() {}
实体构造函数
当使用创建突变在 GraphQL 中创建实体时,它将使用无参数的 buildFromJson()
静态构造函数进行构造,该函数调用构造函数。如果您的实体具有带参数的构造函数,那么您需要在您的实体类中重写 buildFromJson()
并自行调用构造函数。
在您执行任何需要的任务后,您仍然可以使用继承的 hydrate()
调用在此之后填充对象,您必须在此调用之前从输入数组 $data
中取消设置您已经自行填充的任何属性,否则您现有的属性将被覆盖。
事件
除了 Doctrine 提供给您的事件外,模式构建器还会添加在执行某些解析器时触发的事件:beforeUpdate()
和 beforeDelete()
。您可以从中扩展 GraphQLEntity
。这两个事件在从 ORM 获取实体初始状态后立即触发,并且在任何操作之前执行。(特别是对于 beforeDelete()
,这意味着可以访问所有字段,包括生成的值。)
权限
无论您是否打算在此级别实现权限,您始终需要实现 hasPermission()
。您可以在下面找到更多关于实现权限的详细信息,或者暂时用 return true;
模拟。出于安全原因,构建器默认不使用此方法。
构建模式
在您选择的实体上构建一个模式构建器。您必须提供一个 Doctrine 实体管理器实例,以及一个关联数组,其中键是实体名称的复数形式,值是实体定义的完全限定类名。例如
$builder = new EntitySchemaBuilder($em, [ 'owners' => Owner::class, 'dogs' => Dog::class, 'cats' => Cat::class, ]);
运行查询
您可以使用您构建的模式在您选择的 GraphQL 服务器中,或者使用辅助程序的 graphql-php
集成通过调用 getServer()
获取已经设置了您模式的服务器对象。
服务器返回的对象接受一个请求对象作为其 executeRequest()
方法的参数。在某些情况下,您可能希望将原始 JSON 负载通过服务器运行。为此,您可以通过调用 EntitySchemaBuilder::jsonToOperation($json)
将 JSON 解析为服务器可以接受作为 executeRequest()
参数的格式。
使用权限
权限管理是通过在扩展 GraphQLEntity
时实现的处理器来完成的。hasPermission()
处理器接收 4 个参数,以帮助您实现此功能。
abstract public function hasPermission( EntityManager $em, // an instance of the entity manager DoctrineUniqueInterface $user, // the user you passed to getServer() array $context, // array of additional context you optionally passed to getServer() string $method // action method verb ): bool;
method
对应于当前执行查询或突变所分配的动作动词。生成的查询和突变器使用预设的 CRUD 类型的动词:get
、create
、update
和 delete
,但您可以在编写自己的突变器时使用任何动词。
使用自定义突变器
模式生成器公开了一个简单的 API,用于添加您自己的突变器,以及一个类(Mutation
)。这封装了 graphql-doctrine 的某些高级功能,因此使用此功能可能需要或将需要参考该包的文档。您必须通过将突变器的名称传递给 EntitySchemaBuilder
的工厂方法来实例化 Mutation
。这将 Mutation
与构建器关联,并将其包含在任何使用它生成的模式中。
有两种方法可以填充由工厂返回的新 Mutation
:使用 Mutation
提供的链式方法,或者一次性提供所有参数给它的 hydrate()
方法。下面的示例使用方法链,但相同的原理也适用于 hydrate()
。
setEntity()
: 设置此突变器操作的实体类名。这必须设置,并且如果未提供,将用于自动生成类型。
setType()
: 设置突变器的 GraphQL 返回类型。如果没有配置,这将是 setEntity()
中提供的实体的一个非空列表。默认类型与构建器的 resolveQuery()
方法兼容,如果您的解析函数中调用(见下文)。
setDescription()
: 设置服务器在内省查询中返回的描述(可选)。
setArgs()
: 设置在查询此突变器时可能给出的参数。默认情况下,这是一个非空(必需)的 ID 类型,允许您使用实体管理器检索该 ID 所引用的实体。
setMethod()
: 设置此突变器用于权限目的的动作动词。
setResolver()
: 您必须在这里提供一个可调用的对象,它接受两个参数——您的突变器的参数数组和发起请求的 API 用户。您必须返回您希望随响应返回的数据,并且这些数据必须是正确的类型——EntitySchemaBuilder
中提供了一些辅助方法,建议您在可以访问它和实体管理器的变量作用域中定义此可调用的对象。未能解析正确类型的数据将导致服务器返回错误。
构建器公开的方法
模式构建器公开了各种方法,这些方法在编写解析函数时可能很有用。您可能需要查阅 graphql-php
和 graphql-doctrine
的文档,以了解一些这些方法返回的值的更多信息。
listOfType()
: 当给定一个实体的类名时,返回一个实体的 GraphQL 返回类型列表。
resolveQuery()
: 使用实体管理器解析查询。需要查询中给出的参数数组,以及被查询的根实体的类名。您还可以传递实体的一个实例作为第三个参数,以完全解析并返回此实体。
getMutator()
: 从提供类型、参数和解析器生成突变器(以数组形式,而不是 Mutation
)。
setUserEntity()
: 更改实例化时给出的用户。
getTypes()
: 获取用于在模式中使用的已生成的类型。
isPermitted()
: 根据其参数、查询上下文和实体类名解析查询的权限级别。