-
Notifications
You must be signed in to change notification settings - Fork 0
Aislamiento de Extensiones
Technomantus Corvi edited this page Sep 6, 2026
·
1 revision
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- 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.
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.
-
tanuki_admin—admin/templates/está completamente separado deincludes/. -
tanuki_login—login/views/tiene su propiolayout.php, independiente del chrome del sitio principal.