---
title: "Estructura del Proyecto"
description: "Un recorrido guiado por cada directorio en un proyecto de Nibiru."
---
```
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
```
## Convenciones notables

### Controladores
- Archivo: `application/controller/<nombre>Controller.php`
- Clase: `Nibiru\<nombre>Controller extends Nibiru\Adapter\Controller`
- Métodos requeridos: `pageAction()`, `navigationAction()`. Opcionales: cualquier `<verbo>Action()`.

### Vistas
- Archivo: `application/view/templates/<nombre>.tpl` para el controlador correspondiente.
- Las subvistas van en `application/view/templates/<nombre>/<acción>.tpl`.
- Los parciales compartidos se encuentran en `application/view/templates/shared/`.

### Modelos
- Generados automáticamente en `application/model/`.
- Los nombres de los archivos coinciden con los nombres de las tablas. Cada clase extiende un adaptador `Db` (`MySQL\Db` o `PostgreSQL\Db`).

### Módulos
- Carpeta: `application/module/<nombre>/`
- Cada módulo es su propia isla MVC más tratos, complementos, interfaces y configuraciones.
- El [Registro](/core/registry/) descubre automáticamente las configuraciones `*.ini` dentro de cada carpeta `settings/` del módulo.

### Migraciones
- `application/settings/config/database/<NNN>-<slug>.sql`
- Numeradas. Ejecutar mediante `./nibiru -mi <env>`.
- Un archivo por cambio lógico — no agrupar.

### Vendor de Composer en `core/l/`
Esta es una decisión intencional. `composer.json` establece `vendor-dir: core/l`. El cargador automático del marco espera que esté ahí. No lo muevas.

### `templates_c/` y `cache/`
Smarty debe poder escribir en `templates_c/`. El caché está habilitado opcionalmente a través de la clave INI `[ENGINE] caching = true`. Ambas carpetas deben estar en su archivo `.gitignore`.
