---
title: "Projektstruktur"
description: "Eine durchgeführte Tour jedes Verzeichnisses eines Nibiru-Projekts."
---
```
my-app/
├── core/                   # Framework code (don't edit)
│   ├── a/                  # Abstract classes + adapters
│   ├── c/                  # Concrete classes (router, view, form types…)
│   ├── f/                  # Factories (db, form)
│   ├── i/                  # Interfaces
│   ├── l/                  # Composer vendor (yes, in core/)
│   ├── t/                  # Traits
│   └── framework.php       # Main bootstrap
├── application/            # Your app
│   ├── controller/         # *Controller.php files
│   ├── model/              # Auto-generated models (from DB schema)
│   ├── module/             # Modules (the second M in MMVC)
│   │   └── users/          #   each with its own MVC + plugins
│   ├── settings/
│   │   └── config/
│   │       ├── settings.<env>.ini
│   │       ├── database/   #   numbered SQL migration files
│   │       └── navigation/main.json
│   └── view/
│       ├── templates/      # Smarty .tpl files
│       ├── templates_c/    # Smarty compile cache (auto)
│       ├── cache/          # HTML cache (when caching=true)
│       └── mockup/         # Static design mockups
├── public/                 # CSS / JS / images / fonts (web-served)
├── nibiru                  # CLI binary
├── index.php               # Entry point
├── composer.json
└── vhost.conf              # Sample nginx vhost
```
## Bemerkenswerte Konventionen

### Controller
- Datei: `application/controller/<name>Controller.php`
- Klasse: `Nibiru\<name>Controller extends Nibiru\Adapter\Controller`
- Erforderliche Methoden: `pageAction()`, `navigationAction()`. Optional: jede `<verb>Action()`.

### Ansichten
- Datei: `application/view/templates/<name>.tpl` für den entsprechenden Controller.
- Unteransichten befinden sich unter `application/view/templates/<name>/<action>.tpl`.
- Gemeinsame Teile liegen in `application/view/templates/shared/`.

### Modelle
- Automatisch unter `application/model/` generiert.
- Dateinamen entsprechen Tabellennamen. Jede Klasse erweitert einen `Db` Adapter (`MySQL\Db` oder `PostgreSQL\Db`).

### Module
- Ordner: `application/module/<name>/`
- Jedes Modul ist eine eigene MVC-Insel plus Traits, Plugins, Schnittstellen und Einstellungen.
- Der [Registry](/core/registry/) entdeckt automatisch die `*.ini`-Einstellungen innerhalb des `settings/`-Ordners jedes Moduls.

### Migrationen
- `application/settings/config/database/<NNN>-<slug>.sql`
- Nummeriert. Führen Sie über `./nibiru -mi <env>` aus.
- Eine Datei pro logischer Änderung – vermeiden Sie die Zusammenführung.

### Composer Vendor in `core/l/`
Dies ist absichtlich. `composer.json` setzt `vendor-dir: core/l`. Der Autoloader des Frameworks erwartet es dort. Bewegen Sie es nicht.

### `templates_c/` und `cache/`
Smarty muss in die `templates_c/` schreiben können. Das Zwischenspeichern ist über den INI-Schlüssel `[ENGINE] caching = true` optional. Beide Ordner sollten in Ihrer `.gitignore` enthalten sein.
