Skip to content

Aislamiento de Extensiones

Technomantus Corvi edited this page Sep 6, 2026 · 1 revision

Aislamiento de extensiones (HasOwnView)

Las extensiones pensadas para ser completamente eliminables (tanuki_admin, tanuki_login) no deberían depender del view() de la app principal — esa función está atada a views/, includes/head.php/footer.php, y config/nav.php. Si el controlador de una extensión llamara a view(), borrar la carpeta de la extensión no sería suficiente; el layout de la app seguiría referenciando cosas que ya no existen.

core/HasOwnView.php es un trait pequeño que da a un controlador su propio renderizado, totalmente autocontenido:

use HasOwnView;

protected function renderOwnView(
    string $baseDir,   // ej. __DIR__ . '/templates'
    ?string $layout,   // nombre de archivo (sin extensión) de la plantilla envolvente, o null
    string $template,  // nombre de archivo (sin extensión) de la plantilla de contenido
    array $data = []
): void

Cuándo usarlo

  • Al construir una extensión nueva pensada para poder borrarse como una sola carpeta → usa HasOwnView, mantén sus plantillas dentro de su propia carpeta.
  • Al añadir una página a tu propio proyecto (no una extensión) → usa $this->view() normal; quieres que comparta el layout principal, el nav y el selector de idioma.

Ejemplo: una extensión mínima

mi-extension/
├── MiExtensionController.php
└── templates/
    ├── layout.php
    └── index.php
class MiExtensionController extends Controller
{
    use HasOwnView;

    public function index(): void
    {
        $this->renderOwnView(__DIR__ . '/templates', 'layout', 'index', [
            'title' => 'Mi Extensión',
        ]);
    }
}

layout.php recibe $content (el resultado renderizado de index.php) y cualquier otra cosa en $data — escríbelo exactamente como una página HTML normal, sin depender de includes/ del proyecto anfitrión.

Usado por

  • tanuki_adminadmin/templates/ está completamente separado de includes/.
  • tanuki_loginlogin/views/ tiene su propio layout.php, independiente del chrome del sitio principal.

Clone this wiki locally