Patrón de plantillas: separar la lógica de la vista
Traslade la lógica de negocio a archivos PHP y mantenga limpias las plantillas HTML.
Patrón de plantillas: separar la lógica de la vista es una lección gratuita de PHP Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de PHP Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de PHP Academy incluye 4 lecciones en total.
Por qué separar la lógica de la vista
Mezclar las consultas a la base de datos, la lógica de negocio y el HTML en el mismo archivo provoca:
- Código espagueti difícil de leer
- Dificultad para probar y reutilizar la lógica
- Errores de seguridad cuando se omite la validación
La solución es mantener cada responsabilidad en su propia capa.
El patrón de plantilla sencillo
Ejecute primero toda la lógica de PHP y, después, genere el HTML:
<?php
// --- LOGIC (top) ---
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user = getUserById($userId);
if (!$user) {
http_response_code(404);
require '404.php';
exit;
}
$pageTitle = 'Profile: ' . $user['name'];
// --- VIEW (bottom) ---
require 'layout/header.php';
?>
<main>
<h1><?= htmlspecialchars($user['name']) ?></h1>
</main>
<?php require 'layout/footer.php'; ?>Separar los archivos del controlador y la vista
Divida el código en un archivo de controlador y otro de vista:
// profile.php (controller)
<?php
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user = getUserById($userId);
$posts = getPostsByUser($userId);
if (!$user) { require '404.php'; exit; }
require 'views/profile.view.php';
// views/profile.view.php (view) — only HTML and echoes
// No DB calls allowed here!Preparar los datos de la vista
Dé formato a todos los datos en la capa de lógica antes de enviarlos a la vista:
<?php
$user = getUserById($id);
$viewData = [
'userName' => htmlspecialchars($user['name']),
'avatarUrl' => $user['avatar'] ?? '/default.png',
'joinedDate' => date('F Y', strtotime($user['created_at'])),
'isAdmin' => in_array('admin', $user['roles']),
];
extract($viewData); // Makes $userName, $avatarUrl, etc.
require 'views/profile.view.php';Patrón de función de plantilla
Incluya la representación de la vista en una función para reutilizarla de forma más limpia:
<?php
function render(string $view, array $data = []): void {
extract($data); // Create variables from array
require __DIR__ . '/views/' . $view . '.php';
}
// Usage:
render('profile', [
'name' => $user['name'],
'email' => $user['email'],
]);Motor de plantillas con búfer de salida
Genere una plantilla y devuélvala como una cadena:
<?php
function renderToString(string $view, array $data = []): string {
extract($data);
ob_start();
require __DIR__ . '/views/' . $view . '.php';
return ob_get_clean();
}
$html = renderToString('email/welcome', ['name' => 'Alice']);
mail($to, 'Welcome!', $html, 'Content-Type: text/html');Cuándo utilizar un motor de plantillas
Para sitios sencillos, el sistema de plantillas nativo de PHP es suficiente. Considere Twig o Blade cuando:
- Quiera que el escape automático esté activado de forma predeterminada
- Los diseñadores necesiten editar plantillas sin conocimientos de PHP
- Necesite herencia de plantillas y macros
- El proyecto tenga muchas vistas y crezca considerablemente
Ejemplo de Twig
Twig (utilizado por Symfony) proporciona una sintaxis clara con escape automático:
<?php
// After: composer require twig/twig
$loader = new Twig\Loader\FilesystemLoader('/templates');
$twig = new Twig\Environment($loader, ['cache' => '/tmp/twig']);
echo $twig->render('profile.html.twig', [
'user' => $user,
'posts' => $posts,
]);
// profile.html.twig:
// <h1>{{ user.name }}</h1> -- auto-escaped by defaultEstructura de directorios MVC
Una estructura MVC mínima para proyectos de PHP sin framework:
project/
controllers/
UserController.php -- handles request, calls model
models/
User.php -- database queries
views/
users/
profile.php -- display only, no logic
public/
index.php -- front controller (router)Patrón de controlador frontal
Enrute todas las solicitudes mediante un único punto de entrada:
<?php
// public/index.php (front controller)
require __DIR__ . '/../vendor/autoload.php';
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = require '../routes.php';
if (isset($routes[$uri])) {
[$controller, $action] = $routes[$uri];
(new $controller)->$action();
} else {
http_response_code(404);
require '../views/404.php';
}Principio de responsabilidad única
Cada archivo debería tener un único motivo para cambiar:
- Modelo: solo cambia cuando cambia la estructura de datos o la lógica de las consultas
- Controlador: solo cambia cuando cambia la lógica de gestión de solicitudes
- Vista: solo cambia cuando cambia la interfaz de usuario o el diseño
Esto facilita probar y mantener cada pieza de forma independiente.
Comprobación rápida
¿Cuál es la principal ventaja de separar la lógica de PHP del código HTML de la vista?
Resumen: patrón de plantillas
Conclusiones clave:
- Ejecute primero toda la lógica y, después, genere el HTML
- Separe el código en archivos de controlador y de vista
- Utilice una función render() con extract()
- El búfer de salida captura el HTML generado
- Considere Twig o Blade para proyectos grandes
- El controlador frontal enruta todas las solicitudes a los controladores correspondientes
Preguntas frecuentes
¿La lección «Patrón de plantillas: separar la lógica de la vista» es gratis?
Sí — el texto completo de «Patrón de plantillas: separar la lógica de la vista» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de PHP Academy, actualiza a CoddyKit PRO. El curso de PHP Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Patrón de plantillas: separar la lógica de la vista»?
Traslade la lógica de negocio a archivos PHP y mantenga limpias las plantillas HTML. Practicas PHP Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar PHP Academy?
No se requiere experiencia previa. PHP Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Patrón de plantillas: separar la lógica de la vista»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de PHP Academy?
Sí. Cada lección de PHP Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Etiquetas de PHP y sintaxis de integración
- HTML dinámico con bucles de PHP
- Inclusión y requerimiento de archivos
- Patrón de plantillas: separar la lógica de la vista