Cuando construimos una aplicación, necesitamos una pieza central que se encargue de transportar datos, aplicar reglas de negocio y validar información. Esa pieza es el modelo, y entender su funcionamiento cambia por completo la forma en que organizamos nuestro código. A continuación se desglosa, paso a paso, cómo crear un modelo desde cero en PHP, cómo asociarlo a un controlador y por qué se le considera el corazón de cualquier sistema.
¿Qué es un modelo y por qué es tan importante?
Un modelo es un paquete que agrupa datos, reglas de validación y lógica de negocio. Aunque la definición suene breve, la responsabilidad que carga es enorme [0:10]. Funciona como un contenedor que encapsula información y permite que distintas partes del sistema la compartan sin que se deforme en el camino.
Dentro de la documentación oficial existe una sección dedicada por completo a los modelos, lo cual da una idea de lo extenso que puede llegar a ser el tema. Sin embargo, lo esencial es comprender que el modelo no depende de la base de datos para existir: es una instancia independiente que, por sí sola, ya tiene sentido.
¿Cómo se crea un modelo paso a paso?
El primer paso es ubicar la carpeta models del proyecto y crear un archivo con el nombre en singular —por ejemplo, Book.php— porque cada instancia representa un solo objeto [1:22].
php
<?php
namespace App\Models;
use Illuminate\Base\Model;
class Book extends Model
{
public string $title;
public string $author;
public function toString(): string
{
return sprintf("%s - %s", $this->title, $this->author);
}
}
La convención de usar el nombre en singular responde a una cuestión de **ontología**: cada vez que instanciamos el objeto, estamos representando *un* libro, no varios. Nótese que no hay ID ni referencia a ninguna tabla; por ahora el modelo vive solo en memoria.
### ¿Cómo se conecta el modelo con el controlador?
Dentro del controlador, la función que lee un archivo CSV itera línea por línea y crea una instancia de `Book` para cada registro [2:50].
php
use App\Models\Book;
// Dentro de la función actionBooks
$book = new Book();
$book->title = $data[1];
$book->author = $data[2];
printf("%s\n", $book->toString());
Un detalle que causa frecuentes dolores de cabeza es la instrucción `use`. Como el controlador y el modelo viven en **namespaces distintos**, es obligatorio importar cada clase de forma individual —nunca con asterisco— para que el intérprete de PHP la reconozca [3:05].
## ¿Qué significa transformar datos en información?
Tener un título suelto y un autor suelto son solo **datos**. Cuando los encapsulamos dentro del modelo y los relacionamos, se convierten en **información** sobre la cual se pueden tomar decisiones [6:20]. Esa diferencia es fundamental: el modelo asocia campos que, por separado, carecen de contexto.
Para demostrarlo, se creó una función privada llamada `quick` que recibe un objeto `Book`, modifica su título y lo devuelve ya transformado [7:10].
php
private function quick(Book $book): Book
{
$book->title = sprintf("%s 🦕", $book->title);
return $book;
}
El flujo completo es:
- Se leen los datos de un archivo.
- Se encapsulan en un objeto tipo modelo.
- El modelo se envía a otra función que lo **opera y transforma**.
- Se regresa modificado y se vuelve a utilizar.
Este ciclo ilustra una de las dos grandes responsabilidades del modelo: **empaquetar datos y ser capaz de traspasarse** entre distintos elementos del sistema sin mutaciones inesperadas [8:30].
## ¿Cómo manejar errores y filtrar datos vacíos?
Al ejecutar el script por primera vez, apareció un *syntax error* en la línea 11 de `Book.php` por omitir la palabra `function`. Una ventaja del *framework* es que los **mensajes de error** son mucho más descriptivos que los de PHP puro: muestran la traza completa de clases y objetos involucrados [5:20].
También fue necesario validar que las líneas del archivo no vinieran vacías antes de crear el modelo:
php
if (!empty($data[0]) && !empty($data[2])) {
// crear y operar el modelo
}
Este filtro evita instancias con datos incompletos y previene errores en tiempo de ejecución.
Las **reglas de negocio** y las **reglas de validación** también son responsabilidad del modelo, aunque se abordarán más adelante, junto con la conexión a base de datos. Si ya estás experimentando con tus propios modelos, comparte en los comentarios qué atributos les has agregado y cómo los estás utilizando.