neos/contentrepository-development-collection

此包已被废弃且不再维护。未建议替代包。

事件源内容库Neos包在一个联合仓库中,以便更容易开发。

资助包维护!
shop.neos.io/neosfunding

安装: 83

依赖项: 0

建议者: 0

安全: 0

星级: 4

观察者: 8

分支: 9

开放问题: 47

类型:neos-package-collection

dev-master 2022-05-03 12:36 UTC

README

Build Status StyleCI

这是一个您可以与普通Neos一起安装的包捆绑,以便在事件源CR上进行实验。

功能比较

✅ 完成

⏩ 当前正在工作

🚫 不会得到支持

功能 当前CR 事件源CR
基本功能
创建/编辑/删除节点
快捷键处理
查询节点
剪切/复制/粘贴
移动节点
隐藏节点
历史记录 (✅)
基本工作区
工作区模块
嵌套工作区
撤销/重做 🚫
设置开始/结束时间
解决引用节点 🚫
菜单渲染
维度菜单渲染
支持“不在菜单中”
更改节点类型
高级功能
维度
维度回退
多个站点
权限/策略
维护
导出/导入 ✅⏩
节点迁移
结构调整(即节点:修复)
完整性检查 🚫
API
独立的读/写API 🚫
更方便的写API
可扩展的读API (✅)自定义节点 ✅ NodeAccessors
FlowQuery兼容
高级测试用例 🚫
不使用ORM,而是直接SQL查询 🚫
异步操作可行 🚫
高效节点移动 🚫
高效节点删除 🚫
近恒定的读性能 🚫
高效的URL生成(路由) 🚫
MySQL支持
Postgres支持 ⏩(性能更高)
不使用Neos/Flow的使用 🚫 准备好的
可扩展属性序列化 🚫 ✅ 通过Symfony Serializer
双向遍历节点引用 🚫
内容合并冲突检测 🚫
内容合并冲突解决 🚫
用户界面
确保在UI中可以发布节点删除
支持维度约束
发布工作区
发布当前页面
丢弃所有
丢弃当前页面
在UI中更改节点类型

包兼容性

  • Flowpack.NodeTemplates 目前不支持,因为它与状态化的Node对象紧密相关。原则上,可以通过提供一个“Node”shim对象,基于ES CR构建一个API兼容版本。

要求

数据库

事件源内容库依赖于一个名为(递归)公用表表达式(CTE)的功能,该功能需要

稍后,我们还将支持PostgreSQL。 (我们知道它会工作,但我们还没有创建迁移或进行测试)。

PHP

新代码应与PHP 7.4兼容

入门/安装

请参阅https://github.com/neos/neos-development-distribution/tree/event-sourced

代码检查

代码检查是通过CodeSniffer和PHPStan完成的。这两个都作为composer脚本来集成(见composer.json)。在提交PR之前,您可以通过运行以下命令手动检查您的分支(位于存储库所在的文件夹中,可能是Neos发行版中的Packages/CR

composer lint

从集合所在的文件夹运行(在Neos发行版中可能是Packages/CR

提交钩子

如果需要,可以将代码检查添加到提交钩子。在集合文件夹中(在Neos发行版中可能是Packages/CR),将类似以下行添加到您的.git/hooks/pre-commit文件中(以下示例适用于DDEV环境)

#!/bin/sh
ddev exec "cd Packages/CR; composer lint"

走向第一个beta版本

  • 创建独立包集合而不是分支
  • 从NodeData导入到事件的命令
  • 使其与Neos.ContentRepository.DimensionSpace包兼容
  • 确保行为测试再次运行
  • 更新CR以支持Neos 5
  • 更新EventSourcedNeosAdjustments以支持Neos 5
  • 内容缓存(#103)
  • 确保功能测试再次运行
  • 弄清楚如何以及是否使用基于事件源的Site/Domain(可能很困难)->已修复;不会使用基于事件源的site/domain
  • 在事件源模式下更改RoutePart处理器
  • 在事件源模式下调整NodeController
  • 添加切换以在Fusion渲染中使用事件源读取模型(可能由于方法签名而困难)
  • 允许根据事件源读取模型打开用户界面
  • 实现节点的显示/隐藏(递归)
  • 根据UI交互创建命令
    • SetProperty命令
    • CreateNode
    • MoveNode
    • ShowNode
    • DisableNode
  • 在本README中创建功能列表,详细说明支持的内容和尚未支持的内容。
  • 支持URL中的空内容维度值;例如,德语为"/de/...",英语为"/..."
  • 为内容集合提供绝对节点引用(例如,演示站点中的共享页脚)
  • 修复策略处理以配置各种UI部分的权限
  • 修复结构树
  • 重新加载后显示正确的工作区状态(顶部发布按钮)
  • [?] 修复内联链接
  • 修复节点树搜索
  • [?] 修复节点树筛选
  • 实现节点修复
  • (此处还有其他待办事项;此列表尚不完整)

Postgres适配器开发

默认情况下,当前激活的是Mysql适配器,因为Postgres仍在开发中。

要激活Postgres,目前需要执行以下步骤在您的发行版中

# Configuration/Objects.yaml

Neos\EventSourcedContentRepository\Domain\Projection\Content\ContentGraphInterface:
  className: 'Neos\ContentGraph\PostgreSQLAdapter\Domain\Repository\ContentHypergraph'

如果您想同时运行Postgres和MySQL进行测试,您需要以下配置

# Configuration/Settings.yaml

Neos:
  EventSourcedContentRepository:
    unstableInternalWillChangeLater:
      testing:
        projectorsToBeReset:
          'Neos\ContentGraph\PostgreSQLAdapter\Domain\Projection\HypergraphProjector': true
        activeContentGraphs:
          'Postgres': 'Neos\ContentGraph\PostgreSQLAdapter\Domain\Repository\ContentHypergraph'
      projection:
        defaultProjectorsToBeBlocked:
          'Neos\ContentGraph\PostgreSQLAdapter\Domain\Projection\HypergraphProjector': true

如果您想在没有MySQL的情况下运行Postgres,您需要以下配置

# Configuration/Settings.yaml

Neos:
  EventSourcedContentRepository:
    unstableInternalWillChangeLater:
      testing:
        projectorsToBeReset:
          'Neos\ContentGraph\PostgreSQLAdapter\Domain\Projection\HypergraphProjector': true
          'Neos\ContentGraph\DoctrineDbalAdapter\Domain\Projection\GraphProjector': false
        activeContentGraphs:
          'Postgres': 'Neos\ContentGraph\PostgreSQLAdapter\Domain\Repository\ContentHypergraph'
          'DoctrineDBAL': false
      projection:
        defaultProjectorsToBeBlocked:
          'Neos\ContentGraph\PostgreSQLAdapter\Domain\Projection\HypergraphProjector': true
          'Neos\ContentGraph\DoctrineDbalAdapter\Domain\Projection\GraphProjector': false

技术说明(针对开发者)

本节应提供不同涉及的包的概述,以帮助理解不同的组成部分。

Neos.ContentRepository

参见neos/neos-development-collection#2202以获取拉取请求。

  • 在命名空间Domain\Projection\Content中,定义了新的NodeInterfaceTraversableNodeInterface
  • 在命名空间Domain\ValueObject中,定义了相应的值对象。
  • 旧的Neos\ContentRepository\Domain\Model\Node实现了完整的新NodeInterface和大部分TraversableNodeInterface。这是必需的,以确保我们可以构建同时与旧的和新的API一起工作的FlowQuery实现。
  • 调整了FlowQuery操作以符合TraversableNodeInterface(待办事项:尚未全部完成)

Neos.Neos

参见neos/neos-development-collection#2202以获取拉取请求。

  • 对核心部分进行了各种细节改进,以使用TraversableNodeInterface(例如FusionView)

Neos.ContentRepository.DimensionSpace

查询配置维度空间的API

CR / Neos.EventSourcedContentRepository

实现事件源CR核心的过渡包。从长远来看,可能会合并到Neos.ContentRepository中。

  • Domain\Context\*实现了工作空间、内容流、节点的命令、命令处理程序和事件
  • Domain\Projection\*实现了变化投影、工作空间列表;并包含主要Content图投影的定义(ContentGraphInterfaceContentSubgraphInterface

CR / Neos.ContentGraph.DoctrineDbalAdapter

使用MySQL查询实现ContentGraphInterfaceContentSubgraphInterface的实例

CR / Neos.ContentGraph.PostgreSQLAdapter

使用PostgreSQL查询实现ContentGraphInterfaceContentSubgraphInterface的实例

CR / Neos.EventSourcedNeosAdjustments

结果表明,需要对Neos.Neos的详细信息进行大量更改,因此该包会钩入Neos生命周期中的多个位置以覆盖某些Neos功能。

我们经常完全覆盖Neos核心中的某些类/行为;因此,在未来某个时候将更改合并回Neos.Neos包将容易得多,因为那时我们可以替换完整的类而不是仅替换单个部分。

该包由以下边界上下文组成,按请求处理顺序列出

NodeImportFromLegacyCR

该包包含一个CommandController和一个服务,用于从读取NodeData生成事件。它可以使用新的CLI命令激活。

EventSourcedRouting

我们通过提供FrontendNodeRoutePartHandlerInterface的额外实现来替换默认的FrontendNodeRoutePartHandler

激活:我们在Objects.yaml中替换了FrontendNodeRoutePartHandlerInterface的实现。

  • 内部,使用HttpRouting命名空间来处理路由内部的行为。

EventSourcedFrontController

这是 Neos.Neos 中的 Frontend\NodeController 的替代品。

激活:我们通过 AOP(在 NodeControllerAspect 中)触发此控制器:当 Neos 控制器调用 processRequest() 时,我们调用新的控制器。

Fusion

  • 我们替换了某些 Fusion 实现,这些实现已被重写以更有效地与 ContentGraph API 一起工作,并且实现了链接(因为该 API 也已更改)。这包括:

    • 菜单 / 维度菜单
    • NodeUri, ConvertUris
    • ContentElementEditable / ContentElementWrapping(因为 ContentElementWrapping 服务已经变化很大)
    • 激活:使用 Settings.yaml 中的 fusion autoInclude,我们加载 Fusion 文件 resource://Neos.EventSourcedNeosAdjustments/Private/Fusion/Root.fusion。此 Root.fusion 替换了上述 Fusion 对象的实现,因此集成者(无需新命名空间)可以按预期工作。
  • Eel NodeHelperWorkspaceHelper

    • 激活:这些助手以 Neos.EventSourcedNeosAdjustments.* 的名称注册;因此有一个单独的名称。这些助手在上述几行中提到的 Root.fusion 中明确使用。
  • 自定义 ExceptionHandler,因为这也需要替换 ContentElementWrappingService

    • 激活:此助手在上述几行中提到的 Root.fusion 中用作异常处理程序。
    • 如果人们自己使用了这些异常处理程序,则需要重新配置它们以使用新的实现。

Fluid

  • 我们替换了链接和内容元素包装视图助手,因为节点链接已更改,内容元素包装也发生了变化。
    • 激活:使用 AOP,ViewHelperReplacementAspect 实现了视图助手类的别名;有效地返回此命名空间中的 VH 而不是默认的 VH。

ContentElementWrapping

我们实现了全新的 ContentElementWrappingServiceContentElementWrappingService;主要是因为它们变化很大,并且它们的接口现在需要 TraversableNodeInterface 而不是旧的 NodeInterface

新服务用于覆盖的视图助手(见上述 Fluid 部分);以及在覆盖的 Fusion 实现中(见上述 Fusion 部分)。

NodeAddress (Domain\Context\Content)

NodeAddress 是节点的外部表示(用于路由)。待办事项:将其移动到 Neos.EventSourcedContentRepository。

Ui

  • BackendController 是 Neos.Neos.Ui BackendController 的替代实现。
    • 激活:我们通过 AOP(在 BackendControllerAspect 中)触发此控制器:当 Neos 后端控制器调用 processRequest() 时,我们调用新的控制器。
  • 我们在后端登录时使用 EditorContentStreamZookeeper 创建内容流(待办事项:可能更改名称?)。
    • 激活:我们通过 Package.php 中的信号/槽触发此服务。
  • Fusion(后端)
    • 激活:我们使用 Views.yaml 加载自定义的 resource://Neos.EventSourcedNeosAdjustments/Private/Fusion/Backend/Root.fusion
    • 自定义 NodeInfoHelper,调用自定义的 NodePropertyConverterService
  • 调整 Resources/Private/UiAdapter 中的 DimensionSwitcher JS 组件
  • 待办事项:这还不是全部。