---
title: "Módulos y Controladores de Esqueleto"
description: "Genera controladores, módulos y complementos con la CLI."
---

## Controladores
```bash
./nibiru -c products
```
Crea dos archivos:
```
application/controller/productsController.php
application/view/templates/products.tpl
```
El esqueleto del controlador:
```php
<?php
namespace Nibiru;
use Nibiru\Adapter\Controller;

class productsController extends Controller
{
    public function pageAction() {
        View::assign(['title' => 'Products']);
    }

    public function navigationAction() {
        JsonNavigation::getInstance()->loadJsonNavigationArray();
    }
}
```
El plantilla stub:
```smarty
{include 'shared/header.tpl'}
<body>
{include file="navigation.tpl"}
<main class="container">
  <h1>{$title}</h1>
</main>
{include 'shared/footer.tpl'}
</body>
```
Los controladores son archivos PHP únicamente — no hay estructura de JS o CSS, por lo que usted mantiene el control del enlace de activos.

## Módulos
```bash
./nibiru -m billing
```
Crea:
```
application/module/billing/
├── billing.php
├── interfaces/billing.php
├── plugins/
├── settings/billing.ini
└── traits/
```
La clase principal implementa `IModule` y expone un constructor que carga la configuración del registro del módulo. Agrega la bandera `-g` para incluir el enrutamiento del observador de Graylog por defecto:
```bash
./nibiru -m billing -g
```
Cuando se establece `-g`, el esqueleto importa un observador `Graylog`, lo adjunta en el constructor y emite `notify()` en los cambios de estado clave — por lo que cualquier servidor de Graylog capaz de GELF recoge eventos del módulo sin necesidad de conexiones adicionales.

## Plugins

Un complemento vive dentro de un módulo:
```bash
./nibiru -p invoices -m billing
```
Crea `application/module/billing/plugins/invoices.php`:
```php
<?php
namespace Nibiru\Module\Billing\Plugin;
use Nibiru\Module\Billing\Billing;

class Invoices extends Billing
{
    public function listOpen(): array
    {
        return \Nibiru\Pdo::fetchAll(
            'SELECT * FROM invoices WHERE status = :s ORDER BY due_date',
            [':s' => 'open']
        );
    }
}
```
Los plugins heredan del módulo, por lo que comparten su registro, configuración y mecanismo de observadores.

## Bootstrap (`-s`)

`./nibiru -s` se ejecuta después de la instalación (o después de hacer un nuevo checkout fresco) para:

- Crea `application/view/templates_c/` y `application/view/cache/` si faltan.
- Verifica los permisos (escribibles por el usuario del servidor web) en esas carpetas.
- Verifica que las extensiones de PHP requeridas estén cargadas.
- Verifica que el controlador de base de datos en tu INI sea compatible con esta versión binaria.

Es seguro ejecutarlo repetidamente.

## Borrar caché (`-cache-clear`)

Borra tanto la caché de compilación de Smarty como la caché de HTML renderizada:
```bash
./nibiru -cache-clear
```
Ejecuta después de una implementación cuando:
- Cambiaste archivos `.tpl`,
- Cambiaste la configuración de `caché` de `[ENGIN]`,
- Modificaste los complementos de Smarty.

La caché se regenera en la siguiente solicitud.
