itx/typo3-graphql

此扩展为TYPO3 CMS提供GraphQL API

安装: 15

依赖者: 0

建议者: 0

安全: 0

星标: 1

关注者: 3

分支: 0

开放问题: 0

类型:typo3-cms-extension

1.0.1 2024-08-01 14:13 UTC

This package is auto-updated.

Last update: 2024-09-01 14:32:42 UTC


README

此扩展为TYPO3提供GraphQL API。它是通过暴露TYPO3数据模型为GraphQL模式来实现的。

任何表都可以配置为在API中可用。模式是完全可配置的。可以通过/graphql端点访问GraphQL API。

⚠️ 此扩展的功能尚未完全完善。预计某些功能可能尚未实现或存在错误。

✨ 特点

  • 自动解析关系
  • 链接生成
  • 图像和文件的URL生成
  • 过滤和分类API
  • 分页
  • 基本语言支持

什么还不起作用?

  • 并非所有TCA字段都受到支持。
  • 语言覆盖尚未实现。
  • 可能还有其他问题:如果您发现任何问题,请创建一个问题或创建一个pull request。

🔨 安装

composer require itx/typo3-graphql

⚙️ 配置

该扩展使用两种机制来配置GraphQL模式。

  1. 要配置模式,请将GraphQL.yaml文件放入扩展或站点包的Configuration目录中。
    • 此文件将被自动加载并与其他扩展的配置文件合并。
    • 有关更多详细信息,请参阅示例配置。它默认启用,因此是一个良好的起点。
  2. 在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事件,因此您可以在自己的扩展中轻松使用它们。事件包括

  1. Itx\Typo3GraphQL\Events\CustomModelFieldEvent - 允许您向模型添加自定义字段。
  2. Itx\Typo3GraphQL\Events\CustomQueryFieldEvent - 允许您向 Query 类型添加自定义字段。
  3. Itx\Typo3GraphQL\Events\CustomQueryArgumentEvent - 允许您向查询字段添加自定义参数。
  4. Itx\Typo3GraphQL\Events\ModifyQueryBuilderForFilteringEvent - 允许您修改用于筛选的查询构建器。

它们以相同的方式工作。您可以通过向事件添加一个或多个 FieldBuilder 实例来向模式添加一个字段。这些提供模式以及解析函数。有关更多信息,请参阅php-graphql 文档。为了方便起见,扩展使用了 simpod/graphql-utils 包,该包提供了 FieldBuilder 类而不是配置数组。

扩展调用根字段构建器的 build 方法。