itx / typo3-graphql
此扩展为TYPO3 CMS提供GraphQL API
Requires
- php: >=8.2
- aimeos/map: ^3
- simpod/graphql-utils: ^0.7
- typo3/cms-core: ^12.4
- typo3/cms-extbase: ^12.4
- typo3/cms-frontend: ^12.4
- webonyx/graphql-php: 15.*
Requires (Dev)
- phpstan/phpstan: ^1.10
README
此扩展为TYPO3提供GraphQL API。它是通过暴露TYPO3数据模型为GraphQL模式来实现的。
任何表都可以配置为在API中可用。模式是完全可配置的。可以通过/graphql
端点访问GraphQL API。
⚠️ 此扩展的功能尚未完全完善。预计某些功能可能尚未实现或存在错误。
✨ 特点
- 自动解析关系
- 链接生成
- 图像和文件的URL生成
- 过滤和分类API
- 分页
- 基本语言支持
什么还不起作用?
- 并非所有TCA字段都受到支持。
- 语言覆盖尚未实现。
- 可能还有其他问题:如果您发现任何问题,请创建一个问题或创建一个pull request。
🔨 安装
composer require itx/typo3-graphql
⚙️ 配置
该扩展使用两种机制来配置GraphQL模式。
- 要配置模式,请将
GraphQL.yaml
文件放入扩展或站点包的Configuration
目录中。- 此文件将被自动加载并与其他扩展的配置文件合并。
- 有关更多详细信息,请参阅示例配置。它默认启用,因此是一个良好的起点。
- 在GraphQL.yaml文件中,您可以定义要公开的域模型,以及是否要公开它。
- 对于每个模型,您可以使用现有模型,也可以定义新模型。您可以将其视为模型的“视图”。
- 之所以这样做,是因为您可能不希望公开模型的所有字段,或者您可能希望以不同的方式公开模型。
- 对于自定义模型中的每个字段,您可以通过
@Expose
注解来定义是否要公开该字段。 - 如果您构建自定义模型,仅用于通过GraphQL公开,则可以使用
@ExposeAll
注解来公开模型中的所有字段。请谨慎使用。 - 请确保您的模型也已正确注册在Extbase持久性配置中。有关如何操作的示例,请参阅扩展自己的持久性配置。
- 还要确保当重写ObjectStorages时,包含正确的ObjectStorage var注解和正确的类型。
⚠️ 您用
@Expose
或@ExposeAll
标记的字段将在GraphQL API中公开访问。
💻 使用
该扩展提供了一个Query
类型,它是所有查询的入口点。Query
类型具有每个已配置为可查询的模型的一个字段。每个已配置的模型都有一个字段来查询多个模型实例,还有一个字段来查询单个模型实例。
👀 检查
默认情况下,在开发模式下启用GraphQL检查,在生产模式下禁用。
⚡ 过滤API
此扩展还提供了一套全面的过滤和分类系统。目前,它支持离散过滤和范围过滤。
配置过滤器有两种方法
- 通过TYPO3后台的后期端
- 通过yaml配置文件。如果需要将一些逻辑分配给过滤器并需要使数据在后台可编辑,则后台配置可能很有用。yaml配置文件是静态的,可以用来配置那些你知道不会更改的过滤器。这两种方法将在运行时合并。
通过后台
您可以在页面树中的任何位置添加过滤器记录。每个过滤器定义了一个名称、它应用的模型以及它应用的字段的过滤器路径。过滤器路径是字段名称的点分隔列表。这意味着可以使用Extbase Repository字段路径语法来对模型关系进行筛选。
通过yaml配置文件
您还可以通过yaml配置文件配置过滤器。有关更多详细信息,请参阅示例配置。字段与后台中相同。
配置过滤器后,您可以在GraphQL查询中使用它,如下所示
查询不进行筛选的过滤器选项的示例查询
postings(filters: { discreteFilters: [{ path: "locations.name", options: [] }] }) {
facets {
label
options {
value
resultCount
disabled
}
path
}
edges {
node {
title
}
}
}
上述查询将返回 Posting 模型的 locations.name
字段的过滤器选项。
如果您想应用一个或多个过滤器选项,可以使用 discreteFilters
字段的 options
参数。
带有筛选的查询示例
postings(filters: { discreteFilters: [{ path: "locations.name", options: ["Testlocation"] }] }) {
facets {
... on DiscreteFacet {
label
options {
value
resultCount
}
path
}
}
edges {
node {
title
}
}
}
这将返回具有名称为 Testlocation
的位置的帖子。您还将注意到,其他过滤器的过滤器选项也被筛选,以便能够禁用不可用的选项,以防止不可能的过滤器选项组合(例如,返回无结果的组合)。
目前有两种类型的过滤器可用
DiscreteFilter
- 此过滤器类型允许您从选项列表中选择一个或多个选项。RangeFilter
- 此过滤器类型允许您选择一系列值。
在上述查询中,过滤器选项也将被筛选,以便能够禁用不可用的选项,以防止不可能的过滤器选项组合。过滤器选项是否仍然会得到结果,可以通过 disabled
字段显示。
请确保始终为要使用的过滤器类型创建一个过滤器记录。否则,过滤器将不会在GraphQL API中可用。
🪩 事件
通过自定义虚拟字段扩展模式
扩展提供了一些事件,允许扩展扩展模式。它们是标准的PSR-14事件,因此您可以在自己的扩展中轻松使用它们。事件包括
Itx\Typo3GraphQL\Events\CustomModelFieldEvent
- 允许您向模型添加自定义字段。Itx\Typo3GraphQL\Events\CustomQueryFieldEvent
- 允许您向Query
类型添加自定义字段。Itx\Typo3GraphQL\Events\CustomQueryArgumentEvent
- 允许您向查询字段添加自定义参数。Itx\Typo3GraphQL\Events\ModifyQueryBuilderForFilteringEvent
- 允许您修改用于筛选的查询构建器。
它们以相同的方式工作。您可以通过向事件添加一个或多个 FieldBuilder
实例来向模式添加一个字段。这些提供模式以及解析函数。有关更多信息,请参阅php-graphql 文档。为了方便起见,扩展使用了 simpod/graphql-utils
包,该包提供了 FieldBuilder
类而不是配置数组。
扩展调用根字段构建器的 build
方法。