flowpack/neos-dimensionresolver

Neos CMS 的支持包,允许任意内容维度解析。

安装次数: 3,248

依赖: 0

建议者: 0

安全: 0

星级: 7

关注者: 14

分支: 10

开放问题: 2

类型:neos-package

2.2.0 2024-07-03 06:45 UTC

This package is auto-updated.

Last update: 2024-09-05 13:56:13 UTC


README

简介

关于内容维度的概述,请参考 Neos 手册的相关章节。

此包通过提供新功能和扩展点,增强了默认的检测和链接到维度预设的能力。

安装

composer require flowpack/neos-dimensionresolver

维度配置

可用的维度和预设可以通过设置进行配置

Neos:
  ContentRepository:
    contentDimensions:

      # Content dimension "language" serves for translation of content into different languages. Its value specifies
      # the language or language variant by means of a locale.
      'language':
        # The default dimension that is applied when creating nodes without specifying a dimension
        default: 'mul_ZZ'
        # The default preset to use if no URI segment was given when resolving languages in the router
        defaultPreset: 'all'
        label: 'Language'
        icon: 'icon-language'
        presets:
          'all':
            label: 'All languages'
            values: ['mul_ZZ']
            resolutionValue: 'all'
          # Example for additional languages:

          'en_GB':
            label: 'English (Great Britain)'
            values: ['en_GB', 'en_ZZ', 'mul_ZZ']
            resolutionValue: 'gb'
          'de':
            label: 'German (Germany)'
            values: ['de_DE', 'de_ZZ', 'mul_ZZ']
            resolutionValue: 'de'

注意:通过 Neos 默认提供的 uriSegment 配置选项仍然受支持,但不再推荐使用。

预设解析

使用此包,除了使用 URI 路径段的传统方式外,还可以以不同的方式解析内容维度预设。因此,还添加了进一步的配置和实现选项。

维度解析器提供了三种基本的 解析模式,可以任意组合并单独配置。

基于 URI 路径段的解析

默认解析模式是 uriPathSegment。与之前的版本默认设置一样,它操作一个额外的路径段,例如 https://domain.tld/{language}_{market}/home.html。以下是可用的配置选项

Neos:
  ContentRepository:
    contentDimensions:
      'market':
        resolution:
          mode: 'uriPathSegment'
          options:
            # The offset defines the dimension's position in the path segment. Offset 1 means this is the second part.
            # This allows for market being the second uriPath part although it's the primary dimension.
            offset: 1
      'language':
        resolution:
          mode: 'uriPathSegment'
          options:
            # Offset 0 means this is the first part.
            offset: 0
Flowpack:
  Neos:
    DimensionResolver:
      contentDimensions:
       resolution:
         # Delimiter to separate values if multiple dimension are present
         uriPathSegmentDelimiter: '-'

使用给定的配置,URI 将被解析为 domain.tld/{language}-{market}/home.html

注意:可以通过 uriPathSegment 解析任意数量的维度。反过来,只要没有通过 uriPathSegment 解析的内容维度,URI 不会包含任何前缀。

默认预设可以有一个空的 resolutionValue 值。以下示例将在 en_US 预设激活时,不包含 en,但对于其他已定义的语言也会显示 resolutionValue

Neos:
  ContentRepository:
    contentDimensions:

      'language':
        label: 'Language'
        icon: 'icon-language'
        default: 'en_US'
        defaultPreset: 'en_US'
        resolution:
          mode: 'uriPathSegment'
        presets:
          'en_US':
            label: 'English (US)'
            values: ['en_US']
            resolutionValue: ''

唯一的限制是所有解析值必须在通过 uriPathSegment 解析的所有维度中是唯一的。如果您需要非唯一的解析值,您可以关闭对非空维度的支持

Neos:
  Neos:
    routing:
      supportEmptySegmentForDimensions: false

基于子域的解析

另一种解析模式是 subdomain。此模式从主机名的第一部分提取信息,并在生成 URI 时相应地添加。

Neos:
  ContentRepository:
    contentDimensions:
      'language':
        default: 'en'
        defaultPreset: 'en'
        resolution:
          mode: 'subdomain'
          options:
            # true means that if no preset can be detected, the default one will be used.
            # Also when rendering new links, no subdomain will be added for the default preset
            allowEmptyValue: true
        presets:
          'en_GB':
            label: 'English'
            values: ['en']
            resolutionValue: 'en'
          'de':
            label: 'German (Germany)'
            values: ['de_DE']
            resolutionValue: 'de'

使用给定的配置,URI 将被解析为 {language}.domain.tld/home.html

注意:只能通过子域解析一个维度。

基于顶级域的解析

最后的解析模式是 topLevelDomain。此模式从主机名的最后一部分提取信息,并在生成 URI 时相应地添加。

Neos:
  ContentRepository:
    contentDimensions:
      'market':
        default: 'eu'
        defaultPreset: 'eu'
        resolution:
          mode: 'topLevelDomain'
        presets:
          'EU':
            label: 'European Union'
            values: ['EU']
            resolutionValue: 'eu'
          'GB':
            label: 'Great Britain'
            values: ['GB']
            resolutionValue: 'co.uk'
          'DE':
            label: 'Germany'
            values: ['DE', 'EU']
            resolutionValue: 'de'

使用给定的配置,URI 将被解析为 domain.{market}/home.html

注意:只能通过顶级域解析一个维度。

自定义解析

已提供计划中的扩展点以支持基本实现不满足需求时的自定义实现。

定义自定义解析组件

每个解析模式由两个组件定义:一个实现 Neos\Neos\Http\ContentDimensionDetection\ContentDimensionPresetDetectorInterface 的实现,用于从 HTTP 请求中提取预设;以及一个实现 Neos\Neos\Http\ContentDimensionLinking\ContentDimensionPresetLinkProcessorInterface 的实现,用于对匹配给定维度预设的链接进行后处理。

这些可以针对每个维度单独实现和配置

Neos:
  ContentRepository:
    contentDimensions:
      weather:
        detectionComponent:
          implementationClassName: 'My\Package\Http\ContentDimensionDetection\WeatherDimensionPresetDetector'
        linkProcessorComponent:
          implementationClassName: 'My\Package\Http\ContentDimensionLinking\WeatherDimensionPresetLinkProcessor'

如果您的自定义预设解析组件不会影响 URI,您可以使用 Flowpack\Neos\DimensionResolver\Http\ContentDimensionLinking\NullDimensionPresetLinkProcessor 实现作为链接处理器。

注意

如果您想替换基本解析模式之一的实现,也可以这样做。

完全替换解析行为

所述配置和扩展点假定所有维度预设都可以独立解决。然而,可能存在更复杂的情况,其中一个维度的解决依赖于另一个维度的解决结果。以一个子域(语言)和顶级域(市场)为基础的场景为例,您可能希望支持domain.frdomain.dede.domain.chfr.domain.chit.domain.ch。虽然可以将子域定义为可选的,但默认语言取决于市场:domain.de应解析为默认语言de,而domain.fr应解析为默认语言fr。对于这些复杂场景,使用单独的实现而不是复杂的配置工作更为合适。

为了使开发者能够以优雅的方式处理这种情况,存在预定义的方式来处理检测和链接处理。

检测是通过一个可以由配置替换的HTTP中间件完成的。

Neos:
  Flow:
    http:
      middlewares:
        detectContentSubgraph:
          middleware: Flowpack\Neos\DimensionResolver\Http\DetectContentSubgraphMiddleware

链接处理由Flowpack\Neos\DimensionResolver\Http\ContentSubgraphUriProcessorInterface完成。为了引入您的自定义行为,实现该接口,并在Flow中像通常一样在Objects.yaml中声明它。

注意:请参考默认实现,以获取有关如何实现解决的进一步提示和想法。