flowpack / neos-dimensionresolver
Neos CMS 的支持包,允许任意内容维度解析。
Requires
- ext-mbstring: *
- neos/flow: ^8.0
- neos/neos: ^8.0
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.fr
、domain.de
、de.domain.ch
、fr.domain.ch
和it.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
中声明它。
注意:请参考默认实现,以获取有关如何实现解决的进一步提示和想法。