Si estás aprendiendo el patrón MVC con Yii Framework, entender qué es un modelo en PHP es el paso que te conecta con el corazón de cualquier aplicación. Aquí descubrirás cómo crear tu primer modelo, cómo encapsular datos y por qué esta capa concentra tanta responsabilidad dentro del sistema.
¿Qué es un modelo y por qué es el corazón de tu aplicación?
Un modelo es un paquete de transporte de datos, reglas de negocio, reglas de validación y lógica de negocio. Suena breve, pero carga con la mayor responsabilidad del sistema. No es la base de datos, no es la vista, no es el controlador: es el contenedor que viaja entre capas llevando información estructurada.
¿Qué es un modelo en programación? Es una clase que empaqueta datos relacionados y la lógica que los acompaña, para moverlos entre las distintas capas de tu aplicación sin que se deformen en el camino.
La documentación oficial de Yii dedica una sección completa a este tema [01:00], y vale la pena leerla cuando quieras profundizar más allá de lo esencial.
¿Cómo crear tu primer modelo en Yii paso a paso?
Dentro de la carpeta models creas el archivo que representará tu entidad. La convención que se usa aquí es nombrarlo en singular, porque cada instancia representa un objeto individual, no una colección [01:45].
¿Por qué usar singular en el nombre del modelo?
Cada vez que instancias el modelo, creas un libro, no varios libros. Es una decisión ontológica, no una regla obligatoria, pero ayuda a pensar el código con claridad.
El esqueleto base de un modelo en Yii se ve así:
php
<?php
namespace app\models;
use yii\base\Model;
class Book extends Model
{
public $title;
public $author;
}
Fíjate en algo importante: este modelo **no está conectado a la base de datos**. Es una instancia que vive sola, sirve solo como contenedor de información. Por eso no tiene `id` todavía.
### ¿Cómo importar un modelo en otro namespace?
Cuando uses el modelo desde un controlador que vive en otro namespace, debes traerlo con `use app\models\Book`. Y siempre **uno por uno**, nada de asteriscos. Algunos intérpretes modernos de PHP ya ni siquiera aceptan esa práctica.
## ¿Cómo se usa un modelo dentro del controlador?
En el controlador modificas la acción `actionBooks` para que, en vez de imprimir un arreglo crudo, instancie un modelo por cada línea procesada del archivo [04:30].
El flujo se ve así:
- Abres el stream del archivo.
- Iteras sobre cada línea.
- Filtras los datos vacíos con `!empty($data[0])` para evitar errores.
- Creas un nuevo `Book` y asignas `title` y `author`.
- Imprimes la representación del objeto.
php
use app\models\Book;
$book = new Book();
$book->title = $data[1];
$book->author = $data[2];
echo printf("%s\n", $book->toString());
Nota que aquí no usamos `save()`. Como el modelo no tiene un recurso al cual bajarse (archivo, base de datos, cinta magnética), guardar no tendría sentido todavía.
## ¿Cómo agregar un método toString al modelo?
Dentro del modelo defines una función que devuelva el título y el autor concatenados. Lo importante: **no incluyas saltos de línea ni formato visual ahí**, porque eso es responsabilidad de la capa de vistas [07:20].
php
public function toString()
{
return sprintf("%s - %s", $this->title, $this->author);
}
La diferencia entre `sprintf` y `printf` es clave: `sprintf` te devuelve el string, mientras que `printf` lo imprime directamente.
> **¿Cuál es la diferencia entre sprintf y printf en PHP?** `sprintf` retorna el texto formateado como string para que lo uses después. `printf` lo envía directo a la salida.
## ¿Cómo transformar datos usando un modelo como parámetro?
Aquí viene lo interesante. Puedes crear una función privada que reciba un objeto `Book`, lo modifique y lo regrese transformado. Esto demuestra cómo los modelos viajan entre métodos manteniendo su estructura.
php
private function quick(Book $book)
{
$book->title = sprintf("%s ffff", $book->title);
return $book;
}
Al invocar `$book = $this->quick($book)`, el objeto entra, se modifica el título agregando cuatro `f` al final, y sale listo para imprimirse. Si existiera un punto de persistencia, también podrías guardarlo ahí mismo.
Este pequeño ejercicio ilustra la primera gran responsabilidad del modelo: **empaquetar datos para generar información y trasladarse entre elementos del sistema sin mutaciones inesperadas**.
## ¿Cómo interpretar los errores que lanza Yii?
Una gran ventaja para el desarrollador es el manejo de errores de Yii. El framework va más allá del error nativo de PHP: hace *inception* sobre las clases involucradas y muestra la traza completa de objetos utilizados para llegar al fallo [10:15]. Cuando aparezca un mensaje como `Syntax error en book.php línea 11`, te lleva directo al punto exacto y te dice qué está mal.
Un error típico al empezar es olvidar la palabra `function` antes de un método público. Otro común es no filtrar líneas vacías al leer un archivo, lo que rompe la asignación de variables.
## De datos sueltos a información: el valor real del modelo
Cuando tienes el título por un lado y el autor por otro, son solo dos datos. Cuando los unes en un modelo, generas **información**: una relación sobre la que se puede operar, decidir y actuar. Esa es la esencia del trabajo de un programador.
El modelo te ayuda a:
- Asociar datos relacionados en un solo objeto.
- Enviarlos entre capas sin perder integridad.
- Procesarlos, transformarlos o devolverlos.
- Aplicar más adelante reglas de negocio y validación.
¿Ya tienes claro cómo encapsular tus datos en un modelo? Cuéntame en los comentarios cómo estructuras los tuyos y qué dudas te surgieron al crear tu primera clase `Book`.