Cuando ya tienes los modelos y controladores listos, el paso natural es darle cara visible a tu aplicación. Aquí se explica cómo construir vistas en PHP dentro del framework Yii, conectándolas con los controladores y modelos existentes para mostrar datos reales en el navegador, todo sin usar ningún framework de front end.
¿Cómo se organiza la estructura de vistas en Yii?
Cada controlador tiene su propia carpeta dentro del directorio views. Por ejemplo, para el controlador author se crea la carpeta views/author/, y para book, la carpeta views/book/ [01:10]. Esta convención mantiene el proyecto ordenado y facilita localizar cualquier archivo de vista.
Dentro de cada carpeta se crean archivos PHP que corresponden a las acciones del controlador. Lo más cómodo es nombrarlos igual que la acción: si la acción es detail, el archivo se llama detail.php [01:30]. Aunque el nombre puede variar, seguir esta convención simplifica mucho el mantenimiento.
¿Qué hace la función render en el controlador?
La función render es el puente entre el controlador y la vista. Se invoca con $this->render() y recibe dos parámetros [02:15]:
- Nombre del template: el archivo de vista que se utilizará (por ejemplo,
'detail'). No hace falta agregar la extensión .php.
- Arreglo de variables: un arreglo asociativo donde la llave es el nombre de la variable disponible en la vista y el valor es el dato que viene del controlador.
Un error muy común al trabajar con Yii es enviar las variables directamente en lugar de empaquetarlas en un arreglo llave-valor [03:30]. La forma correcta luce así:
php
return $this->render('detail', [
'vistaAutor' => $author,
]);
De esta manera, en la vista se accede a $vistaAutor, que es un objeto del modelo Author.
¿Cómo se imprime información del modelo en la vista?
Dentro del archivo detail.php se mezcla HTML con PHP. Por ejemplo, para mostrar el nombre del autor y la lista de sus libros [04:20]:
php
<h1><?php echo $vistaAutor->name; ?></h1>
<h2>Libros</h2>
<ol>
<?php foreach ($vistaAutor->books as $book): ?>
<li><?php echo $book->title; ?></li>
<?php endforeach; ?>
</ol>
Este bloque recorre la relación books del modelo Author e imprime cada título como elemento de una lista ordenada. Al probar con distintos autores se ven resultados dinámicos: Ian Stewart con un libro, John Krakauer con Into the Wild e Into Thin Air, Alessandro Baricco con tres libros [05:15].
¿Cómo se definen las rutas y se enlazan vistas entre sí?
Antes de que la vista funcione, es necesario registrar la regla de enrutamiento. Para el controlador author, la ruta espera uno o más dígitos como ID y apunta a la acción detail [02:50]:
php
'author/id:\d+' => 'author/detail',
Sin esta regla, el servidor devuelve un error 404.
¿Qué ventaja ofrece el helper HTML de Yii para crear enlaces?
Yii incluye la clase yii\helpers\Html, que permite generar etiquetas HTML de forma programática [06:10]. El método estático Html::a() crea un anchor (enlace) y recibe dos parámetros:
- El texto visible del enlace.
- La URL de destino, que puede ser un string o un arreglo con controlador, acción y parámetros.
php
use yii\helpers\Html;
echo Html::a($book->title, ['book/detail', 'id' => $book->id]);
Esta forma de construir URLs es mucho más robusta que escribir rutas a mano. Yii genera automáticamente la dirección correcta —por ejemplo, /book/117— y al hacer clic, el usuario llega al detalle del libro correspondiente [07:05]. En apenas tres minutos se conectaron las vistas de autores con las de libros.
¿Por qué considerar un template engine como Smarty?
Mezclar PHP con HTML funciona, pero el código resultante es difícil de leer y mantener. Un template engine como Smarty separa la lógica de presentación del código de servidor, ofreciendo una sintaxis más limpia que se integra muy bien con Yii [07:50]. Esto permite escribir vistas más legibles sin sacrificar funcionalidad.
Si ya dominas la conexión entre modelos, controladores y vistas con PHP puro, el siguiente paso lógico es explorar Smarty para mejorar la experiencia de desarrollo. ¿Ya has probado algún template engine en tus proyectos? Comparte tu experiencia.