PHPackages                             tdausner/neos.folder - 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. [Database &amp; ORM](/categories/database)
4. /
5. tdausner/neos.folder

ActiveNeos-package[Database &amp; ORM](/categories/database)

tdausner/neos.folder
====================

A Content Repository based folder system

1.0(2y ago)19GPL-3.0-or-laterPHPPHP &gt;=8.1

Since Jun 10Pushed 2y ago2 watchersCompare

[ Source](https://github.com/tdausner/Neos.Folder)[ Packagist](https://packagist.org/packages/tdausner/neos.folder)[ RSS](/packages/tdausner-neosfolder/feed)WikiDiscussions 1.0 Synced 1mo ago

READMEChangelog (2)Dependencies (1)Versions (2)Used By (0)

The Neos.Folder package
=======================

[](#the-neosfolder-package)

**A Content Repository based folder system**

This package implements a strictly hierarchical folder system based on the Neos Content Repository (**CR**).

Neos/Flow Content Repository
----------------------------

[](#neosflow-content-repository)

If you are familiar with the [Neos/Flow Content Repository](https://docs.neos.io/guide/manual/content-repository)you may [skip this section](#neosfolder-system).

The Neos/Flow Content Repository (CR) is an abstraction layer to whatsoever is implemented as permanent storage (usually a database system). This brief introduction does not claim completeness. It covers the aspects required for the understanding of the CR based **Neos.Folder** system.

When you set up the first site in Neos, the CR contains a hierarchical structure of entries starting with the path `/sites`.

The CR is capable of holding many such hierarchical structures. Some examples:

- `/sites` defined in class `SiteService` from package `Neos.Neos`
- `/assets` defined in class `MetaDataRepository` from package `Neos.MetaData.ContentRepositoryAdapter`
- `/taxonomies` defined in file `Settings.yaml` from package `Sitegeist.Taxonomy`

#### Nodes

[](#nodes)

The basic unit in the CR is a **Node**. Each Node is identified by

- `path` example: `/var/www/html` - you know this from directory trees, or
- `identifier` example: `c255046d-4215-456f-b2f9-017db059cf55`

But that's not all. The CR can hold the same Node in different **variants** to keep different properties for different languages and/or countries. In the CR the different variants are called **dimensions**.

As of this a **Node** is unique by `path` or `identifier` AND `dimensions`.

#### Dimensions

[](#dimensions)

Dimensions are defined in file `Settings.yaml` in `Neos.ContentRepository.contentDimensions` section (see for example the site package `Neos.Demo`). In the settings file there are defined `constraints` as not all combinations of the defined dimensions (`language` and `country`) do make sense. You can define any `dimension`in your project's `Configuration/Settings.yaml` file in addition to the standard dimenions. For a details have a look at the [**NEOS Content Dimensions**](https://docs.neos.io/guide/manual/content-repository/content-dimensions)documentation.

#### Properties

[](#properties)

Any Node in the CR can hold properties. One Node in the CR can hold variants for any combination of dimensions and hence different property `key => value` pairs (properties).

Neos.Folder system
------------------

[](#neosfolder-system)

### Dimensions

[](#dimensions-1)

The Neos.Folder system follows the CR in sense of different variants by dimensions. For root folders (like `/assets` in the example above) a folder may be added without dimensions.

### Properties

[](#properties-1)

#### Default properties

[](#default-properties)

The Neos.Folder package offers a strictly hierarchical system of folders. It extends the CR by three default properties:

- folder title
- folder title path
- associations

##### Folder title and folder title path

[](#folder-title-and-folder-title-path)

If you want to utilize Neos.Folder displaying the path name (or parts of it, a path segment or CR `Node` name) of the folder, it is not possible to stick to the CR's path names, as a CR path name consists of lower case characters, numbers and slashes. No upper case, no spaces and, what's most important, no diacritics (Umlaut).

Hence, a natural language string is kept as folder title and constructed from all titles of the parent folders a folder title path.

##### Associations

[](#associations)

To keep information of associated Neos objects the `associations` property array is utilized. A reference is stored as a Node's identifier. The API offers a method to associate or dissociate an object to a folder following the syntax of setting and clearing a symbolic link:

- setting a symbolic link: `ln -s  `
- removing it: `rm `

#### Other properties

[](#other-properties)

The API contains methods for setting, clearing and retrieving properties. The Neos.Folder property API filters the [default properties](#default-properties).

### Adoption

[](#adoption)

Imagine a folder system where your application sets up a base folder (like `/your-application/folder/`). Next the backend user(s) extend this folder system with sub folders (and sub sub folders...). This ends up in a folder tree. The title of each folder is specific for the user's session dimensions (see [Folder title and folder title path](#Folder-title-and-folder-title-path)).

If the site is set up for multi dimensions, the backend user can copy the whole site to some new dimensions by change of dimension in the backend. The whole site tree is copied to the new dimensions. The same applies to the Neos.Folder system. After the adoption of the folder tree by the new dimension the same folder tree is available for the new dimensions. If the change of dimensions goes along with a language switch, the backend may translate and set the titles of the folders.

### Configuration

[](#configuration)

Some default parameters are defined in the package's file [`Settings.yaml`](Configuration/Settings.yaml):

```
Neos:
  Folder:
    defaults:
      nodeType: 'Neos.Folder:Folder'
      titlePropertyKey: 'title'
      titlePathPropertyKey: 'titlePath'
      associationsPropertyKey: 'associations'
      adoptOnEmpty: true
```

The first four properties (`nodeType`, `titlePropertyKey`, `titlePathPropertyKey` and associationsPropertyKey) need no further explanation.

The propertiy `adoptOnEmpty` controls the behaviour of the service API. This property determines the behaviour of the `get` service, if there is no folder (tree) available for the (possibly new) session dimensions. On `true` the folder tree is adopted from the default dimensions.

The node type `Neos.Folder:Folder` is defined in the package's file [`NodeTypes.Folder.yaml`](Configuration/NodeTypes.Folder.yaml):

```
'Neos.Folder:Folder':
  label: 'Neos Folder'
  superTypes:
    'Neos.Neos:Node': TRUE
  constraints:
    nodeTypes:
      '*': FALSE
  properties:
    title:
      type: string
    titlePath:
      type: string
    associations:
      type: references
```

### Command line interface and API

[](#command-line-interface-and-api)

The Command line flow interface provides commands to add, set title, remove, adopt, move, set or clear property, associate folders and show all root folder. Commands to list, export and import folder trees are also available. For more information either use `./flow help folder` command or see [**Flow commands** documentation](Documentation/FlowCommands.md).

The Neos.Folder package has two APIs:

- [**PHP API**](Documentation/API.md#PHP-API)
- [**Web Service API**](Documentation/API.md#Web-Service-API).

For more information follow one of the links above.

### Requirements

[](#requirements)

- PHP 8.x
- Neos/Flow 8.x

###  Health Score

24

—

LowBetter than 32% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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.

###  Release Activity

Cadence

Every ~0 days

Total

2

Last Release

1072d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6f36ac634dad2195a1732d9ef2684f3f8e78a74fd41f6c06517cb2efacb47065?d=identicon)[tdausner](/maintainers/tdausner)

---

Top Contributors

[![tdausner](https://avatars.githubusercontent.com/u/19776511?v=4)](https://github.com/tdausner "tdausner (10 commits)")

### Embed Badge

![Health badge](/badges/tdausner-neosfolder/health.svg)

```
[![Health](https://phpackages.com/badges/tdausner-neosfolder/health.svg)](https://phpackages.com/packages/tdausner-neosfolder)
```

###  Alternatives

[doctrine/orm

Object-Relational-Mapper for PHP

10.2k285.3M6.2k](/packages/doctrine-orm)[jdorn/sql-formatter

a PHP SQL highlighting library

3.9k115.1M102](/packages/jdorn-sql-formatter)[mongodb/mongodb

MongoDB driver library

1.6k64.0M546](/packages/mongodb-mongodb)[reliese/laravel

Reliese Components for Laravel Framework code generation.

1.7k3.4M16](/packages/reliese-laravel)[wildside/userstamps

Laravel Userstamps provides an Eloquent trait which automatically maintains `created\_by` and `updated\_by` columns on your model, populated by the currently authenticated user in your application.

7511.7M13](/packages/wildside-userstamps)[usmanhalalit/laracsv

A Laravel package to easily generate CSV files from Eloquent model.

6151.7M4](/packages/usmanhalalit-laracsv)

PHPackages © 2026

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