PHPackages                             neos/contentrepository-development-collection - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. neos/contentrepository-development-collection

AbandonedArchivedNeos-package-collection[Utility &amp; Helpers](/categories/utility)

neos/contentrepository-development-collection
=============================================

Event sourced Content Repository Neos packages in a joined repository for easier development.

4839[40 issues](https://github.com/neos/contentrepository-development-collection/issues)[7 PRs](https://github.com/neos/contentrepository-development-collection/pulls)PHP

Since May 5Pushed 4y ago5 watchersCompare

[ Source](https://github.com/neos/contentrepository-development-collection)[ Packagist](https://packagist.org/packages/neos/contentrepository-development-collection)[ RSS](/packages/neos-contentrepository-development-collection/feed)WikiDiscussions master Synced 4w ago

READMEChangelogDependenciesVersions (27)Used By (0)

Event Sourced Content Repository Collection
===========================================

[](#event-sourced-content-repository-collection)

[![Build Status](https://github.com/neos/contentrepository-development-collection/actions/workflows/build.yml/badge.svg?branch=master)](https://github.com/neos/contentrepository-development-collection/actions/workflows/build.yml?query=branch%3Amaster) [![StyleCI](https://camo.githubusercontent.com/b8ced504d3df037f2779be319f480682d650d6f7d0a57de8584af396cd114c5b/68747470733a2f2f6769746875622e7374796c6563692e696f2f7265706f732f3135313732323538352f736869656c643f6272616e63683d6d6173746572)](https://github.styleci.io/repos/151722585)

This is the package bundle you can install alongside a plain Neos to play around with the event-sourced CR.

Feature comparison
------------------

[](#feature-comparison)

✅ Done

⏩ Currently worked on

🚫 Will not be supported

FeatureCurrent CREvent Sourced CR**Basics**Create/ Edit / Delete Nodes✅✅Shortcut Handling✅✅Query Nodes✅✅Cut / Copy / Paste✅✅Move Nodes✅✅Hide Nodes✅✅History(✅)Basic Workspaces✅✅Workspace Module✅✅Nested Workspaces✅Undo / Redo🚫Setting Start / End time✅Resolving Referencing Nodes🚫✅Menu Rendering✅✅Dimension Menu Rendering✅✅Supporting "not in menu"✅✅Change node type✅✅**Advanced**Dimensions✅✅Dimension Fallback✅✅Multiple Sites✅✅Permissions / Policy✅**Maintenance**Export / Import✅✅⏩Node Migrations✅✅Structure Adjustments a.k.a. node:repair✅✅Integrity Checks🚫✅**API**Separate Read and Write API🚫✅More convenient write APIExtensible Read API(✅) custom Node✅ NodeAccessorsFlowQuery is compatible✅✅Advanced test cases🚫✅Don't use ORM, but direct SQL queries🚫✅Asynchronous operations possible🚫✅performant node moving🚫✅performant node deletion🚫✅near-constant read performance🚫✅performant URL generation (routing)🚫✅MySQL support✅✅Postgres support✅⏩ (much higher performance)usage without Neos/Flow🚫preparedextensible property serialization🚫✅ through Symfony Serializertraverse node references in both directions🚫✅content merge conflict detection🚫✅content merge conflict resolution🚫⏩**User Interface**Ensure node deletion can be published in UI✅✅Support Dimension Constraints✅Publish Workspace✅✅Publish Current Page✅✅Discard all✅✅Discard Current Page✅✅Change node type in UI✅✅Package Compatibility
---------------------

[](#package-compatibility)

- *Flowpack.NodeTemplates* is currently NOT supported because it works heavily with stateful Node objects. In principle, it can be possible to build an API-compatible version based on the ES CR, by providing a "Node" shim object.

Requirements
------------

[](#requirements)

### DB

[](#db)

The Event Sourced Content Repository relies on a feature called (Recursive) Common Table Expressions (CTE) that require

- [MySQL](https://www.mysql.com/why-mysql/presentations/mysql-80-common-table-expressions/): 8.0+
- [MariaDB](https://mariadb.com/kb/en/library/recursive-common-table-expressions-overview/): 10.2.2+

Lateron, we will also support [PostgreSQL](https://www.postgresql.org/docs/8.4/queries-with.html). (We know it will work, but we did not create migrations or did testing yet).

### PHP

[](#php)

The new code should be compatible with **PHP 7.4**

Getting Started / Installation
------------------------------

[](#getting-started--installation)

See

Linting
-------

[](#linting)

Linting is done via CodeSniffer and PHPStan. Both are integrated as composer scripts (see composer.json). To manually lint your branch before opening a PR, you can run

```
composer lint
```

from the folder the collection resides (probably `Packages/CR` in a Neos distribution)

### Commit hooks

[](#commit-hooks)

Linting can be added to commit hooks if desired. In the collection folder (probably `Packages/CR` in a Neos distribution), add lines similar to the following to your `.git/hooks/pre-commit` file (the example is for a DDEV environment):

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

Road to first running beta
--------------------------

[](#road-to-first-running-beta)

- create standalone package collection instead of branches
- command to import from NodeData to events
- make it work with Neos.ContentRepository.DimensionSpace package
- ensure Behavioral Tests run again
- Update CR for Neos 5
- Update EventSourcedNeosAdjustments for Neos 5
- Content Cache (#103)
- ensure Functional Tests run again
- figure out how/if to use event sourced Site/Domain (!possibly difficult!) -&gt; fixed; won't use event sourced site/domain
- change RoutePart Handler when using event-sourced mode
- adjust NodeController when using event-sourced mode
- add switch to use event-sourced read model in Fusion rendering (!possibly difficult due to method signatures!)
- allow to open User Interface based on Event-Sourced read model
- implement Show/Hide of nodes (recursively)
- create Commands in response to UI interaction
    - SetProperty command
    - CreateNode
    - MoveNode
    - ShowNode
    - DisableNode
- create feature list in this README, detailing what is supported and what not yet.
- support empty content dimension values in URL; e.g. "/de/..." for german, and "/..." for english
- absolute node referencing for ContentCollection (e.g. shared footer in Demo Site)
- fix Policy handling to configure permissions for various UI parts
- fix structure tree
- show correct workspace state after reload (top publish button)
- \[?\] fix inline linking
- fix node tree search
- \[?\] fix node tree filter
- Implement Node Repair
- (further TODOs here; this list is not complete yet)

Development of the Postgres Adapter
===================================

[](#development-of-the-postgres-adapter)

By default, the Mysql Adapter is active right now, as Postgres is still in development.

To activate Postgres, right now, the following steps are needed **in your distribution**:

```
# Configuration/Objects.yaml

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

**if you want to run Postgres and MySQL side by side for the tests, you need the following config:**

```
# 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
```

**if you want to run Postgres without MySQL, you need the following config:**

```
# 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
```

Technical Description (for developers)
======================================

[](#technical-description-for-developers)

This section should give an overview about the different involved packages, to ease understanding the different moving parts.

Neos.ContentRepository
----------------------

[](#neoscontentrepository)

see [neos/neos-development-collection#2202](https://github.com/neos/neos-development-collection/pull/2202) for the Pull Request.

- in namespace `Domain\Projection\Content`, the new `NodeInterface` and `TraversableNodeInterface` are defined.
- in namespace `Domain\ValueObject`, corresponding value objects are defined.
- the old `Neos\ContentRepository\Domain\Model\Node` implements the full new `NodeInterface` and most of `TraversableNodeInterface`. This is needed to ensure we can build FlowQuery implementations which can work with old and new API at once.
- adjusted FlowQuery operations to `TraversableNodeInterface` (TODO not yet all of them)

Neos.Neos
---------

[](#neosneos)

see [neos/neos-development-collection#2202](https://github.com/neos/neos-development-collection/pull/2202) for the Pull Request.

- various detail improvements to use `TraversableNodeInterface` in the core (e.g. FusionView)

Neos.ContentRepository.DimensionSpace
-------------------------------------

[](#neoscontentrepositorydimensionspace)

APIs to query the configured dimension space

CR / Neos.EventSourcedContentRepository
---------------------------------------

[](#cr--neoseventsourcedcontentrepository)

Transition package implementing the event sourced CR core. In the longer run, will probably be merged into Neos.ContentRepository.

- `Domain\Context\*` implements Commands, Command Handlers, Events for Workspace, Content Stream, Nodes
- `Domain\Projection\*` implements projections for changes, workspace listing; and contains the definition for the main `Content` Graph projection (`ContentGraphInterface` and `ContentSubgraphInterface`)

CR / Neos.ContentGraph.DoctrineDbalAdapter
------------------------------------------

[](#cr--neoscontentgraphdoctrinedbaladapter)

implementation of the `ContentGraphInterface` and `ContentSubgraphInterface` using MySQL queries.

CR / Neos.ContentGraph.PostgreSQLAdapter
----------------------------------------

[](#cr--neoscontentgraphpostgresqladapter)

implementation of the `ContentGraphInterface` and `ContentSubgraphInterface` using PostgreSQL queries.

CR / Neos.EventSourcedNeosAdjustments
-------------------------------------

[](#cr--neoseventsourcedneosadjustments)

It turns out that there are numerous changes needed to the details of Neos.Neos - so this package hooks into various places in the Neos lifecycle to override certain Neos functionality.

We often completely override certain classes / behaviors from the Neos core completely; so that should make merging the changes back to the Neos.Neos package at some point a lot easier because we can then replace full classes instead of only individual pieces.

This package consists of the following bounded contexts, listed in their order during request processing:

### NodeImportFromLegacyCR

[](#nodeimportfromlegacycr)

This contains a CommandController and a service to generate events from reading `NodeData`. It can be activated using the new CLI command.

### EventSourcedRouting

[](#eventsourcedrouting)

We replace the default `FrontendNodeRoutePartHandler` by providing an extra implementation of `FrontendNodeRoutePartHandlerInterface`.

**Activation**: We replace the implementation of `FrontendNodeRoutePartHandlerInterface` in `Objects.yaml`.

- internally, the `Http` and `Routing` namespaces are used for behaviours internal to the routing.

### EventSourcedFrontController

[](#eventsourcedfrontcontroller)

This is a replacement for `Frontend\NodeController` of Neos.Neos.

**Activation**: We trigger this controller by AOP (in `NodeControllerAspect`): We call the new controller when `processRequest()` is called for the Neos controller.

### Fusion

[](#fusion)

- We replace certain Fusion implementations which are already re-implemented to work more efficiently with the ContentGraph API; and which implement linking (because this API also changed). This includes:

    - `Menu / DimensionMenu`
    - `NodeUri, ConvertUris`
    - `ContentElementEditable / ContentElementWrapping` (because the ContentElementWrapping service has changed quite a lot)
    - **Activation**: using fusion `autoInclude` in `Settings.yaml`, we load the Fusion file `resource://Neos.EventSourcedNeosAdjustments/Private/Fusion/Root.fusion`. This `Root.fusion` *replaces the implementations* for the aforementioned Fusion objects, so things work as expected for integrators (without new namespaces).
- Eel `NodeHelper` and `WorkspaceHelper`

    - **Activation**: These helpers are registered under the names `Neos.EventSourcedNeosAdjustments.*`; so a separate name. These helpers are explicitely used in the `Root.fusion` mentioned a few lines above.
- custom `ExceptionHandler` because this also needs the replacement `ContentElementWrappingService`.

    - **Activation**: This helper is used as exception handlers in the `Root.fusion` mentioned a few lines above.
    - If people used these exception handlers themselves, they need to reconfigure them to the new implementations.

### Fluid

[](#fluid)

- We replace Linking and Content Element Wrapping ViewHelpers, because Node Linking has changed and ContentElementWrapping has changed as well.
    - **Activation**: Using AOP, the `ViewHelperReplacementAspect` implements aliasing of ViewHelper classes; effectively returning the VHs in this namespace instead of the default ones.

### ContentElementWrapping

[](#contentelementwrapping)

We implement a completely new `ContentElementWrappingService` and `ContentElementWrappingService`; mainly because they change quite a bit and their interfaces now require `TraversableNodeInterface` instead of the legacy `NodeInterface`.

The new services are used in the overridden ViewHelpers (see section *Fluid* above); and in overridden Fusion implementations (see section *Fusion* above).

### NodeAddress (Domain\\Context\\Content)

[](#nodeaddress-domaincontextcontent)

A `NodeAddress` is an external representation of a node (used in routing). TODO: Move to Neos.EventSourcedContentRepository.

### Ui

[](#ui)

- `BackendController` is an alternative implementation for `Neos.Neos.Ui` `BackendController`.
    - **Activation**: We trigger this controller by AOP (in `BackendControllerAspect`): We call the new controller when `processRequest()` is called for the Neos backend controller.
- We create Content Streams on backend login using the `EditorContentStreamZookeeper` (TODO change name maybe?).
    - **Activation**: We trigger this service by Signal/Slot in `Package.php`.
- `Fusion` (for backend)
    - **Activation**: We load a custom `resource://Neos.EventSourcedNeosAdjustments/Private/Fusion/Backend/Root.fusion` using `Views.yaml`.
    - custom `NodeInfoHelper`, calling to a custom `NodePropertyConverterService`
- adjust the *DimensionSwitcher* JS component in `Resources/Private/UiAdapter`
- TODO: this is not everything yet.

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance0

Infrequent updates — may be unmaintained

Popularity16

Limited adoption so far

Community20

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 75.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/11575267?v=4)[Neos](/maintainers/neos)[@neos](https://github.com/neos)

---

Top Contributors

[![skurfuerst](https://avatars.githubusercontent.com/u/190777?v=4)](https://github.com/skurfuerst "skurfuerst (662 commits)")[![bwaidelich](https://avatars.githubusercontent.com/u/307571?v=4)](https://github.com/bwaidelich "bwaidelich (174 commits)")[![robertlemke](https://avatars.githubusercontent.com/u/95582?v=4)](https://github.com/robertlemke "robertlemke (16 commits)")[![daniellienert](https://avatars.githubusercontent.com/u/642226?v=4)](https://github.com/daniellienert "daniellienert (14 commits)")[![nezaniel](https://avatars.githubusercontent.com/u/1687674?v=4)](https://github.com/nezaniel "nezaniel (5 commits)")[![albe](https://avatars.githubusercontent.com/u/4259532?v=4)](https://github.com/albe "albe (3 commits)")[![kitsunet](https://avatars.githubusercontent.com/u/324408?v=4)](https://github.com/kitsunet "kitsunet (2 commits)")[![davidspiola](https://avatars.githubusercontent.com/u/7107011?v=4)](https://github.com/davidspiola "davidspiola (2 commits)")

### Embed Badge

![Health badge](/badges/neos-contentrepository-development-collection/health.svg)

```
[![Health](https://phpackages.com/badges/neos-contentrepository-development-collection/health.svg)](https://phpackages.com/packages/neos-contentrepository-development-collection)
```

###  Alternatives

[junohamburg/kirby-reload-on-save

Kirby Reload On Save

293.4k](/packages/junohamburg-kirby-reload-on-save)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
