Creación de Componentes Dinámicos con Livewire en Laravel

Clase 11 de 21Curso de Introducción a Laravel 8

Resumen

Construir interfaces dinámicas sin escribir montañas de código PHP es posible gracias a Livewire, la tecnología que Laravel recomienda para trabajar con componentes reutilizables. A continuación se explica cómo crear un componente desde cero, conectarlo con una consulta a la base de datos y configurar relaciones Eloquent para que todo funcione correctamente.

¿Qué es Livewire y por qué usarlo en Laravel?

Livewire permite crear interfaces dinámicas de forma simple y sencilla [0:06]. En el pasado, cuando se necesitaba mostrar diferentes elementos en una sola vista, se recurría a un controlador con múltiples métodos y consultas. Livewire cambia ese enfoque: cada pieza de la interfaz se convierte en un componente independiente que encapsula tanto la lógica PHP como el HTML correspondiente, lo que resulta en proyectos más modernos y profesionales.

¿Cómo se crea un componente con el comando artisan?

El proceso comienza en la terminal con el comando php artisan make:livewire seguido del nombre del componente [0:44]. Por ejemplo, para un listado de cursos:

bash php artisan make:livewire ListadoCursos

  • Se utiliza CamelCase porque el nombre funciona como una clase PHP [0:56].
  • Laravel genera automáticamente dos archivos: una clase PHP y una vista Blade.
  • En la carpeta de vistas, el nombre se transforma a minúsculas separadas por guiones: listado-cursos.blade.php [1:24].

Todo componente debe tener un único contenedor (un div que abre y cierra) para que el renderizado funcione correctamente [1:56].

¿Cómo se invoca el componente dentro de una vista?

Para mostrar el componente basta con usar una etiqueta HTML especial dentro de la vista principal [1:35]:

html <livewire:listado-cursos />

Al actualizar el navegador, el contenido del componente se renderiza directamente en la página index [1:44].

¿Dónde se programa la lógica del componente?

La clase PHP del componente se encuentra en app/Http/Livewire/ [2:06]. Su método render() es el encargado de devolver la vista asociada. Dentro de este método se pueden ejecutar consultas Eloquent y pasar variables a la vista, exactamente igual que en un controlador tradicional.

Por ejemplo, para obtener un listado de cursos con sus usuarios asociados y limitado a nueve registros [2:28]:

php public function render() { $cursos = Course::latest()->with('user')->take(9)->get();

return view('livewire.listado-cursos', compact('cursos'));

}

  • latest() ordena los resultados por los más recientes.
  • with('user') carga la relación con el usuario (eager loading) para evitar el problema de consultas N+1.
  • take(9) limita los resultados a nueve elementos.
  • get() es el método obligatorio que ejecuta la consulta [2:52].

¿Cómo configurar relaciones Eloquent entre modelos?

Al intentar cargar la relación user sin haberla definido, Laravel arroja un error indicando que la relación no existe [3:02]. Aunque la clave foránea se creó en la migración, es necesario declarar la relación en el modelo Eloquent.

Dentro del modelo Course se añade un método que define que un curso pertenece a un usuario (belongs to) [3:18]:

php public function user() { return $this->belongsTo(User::class); }

  • belongsTo indica una relación de pertenencia: cada curso tiene un dueño.
  • El nombre del método (user) coincide con el nombre de la relación que se invoca en with('user').

¿Cómo iterar los resultados en la vista del componente?

Una vez configurada la consulta y la relación, la vista del componente puede recorrer los resultados con @foreach [3:55]:

blade @foreach($cursos as $course) {{ $course->id }} @endforeach

Al actualizar el navegador aparecen todos los IDs de los cursos obtenidos, confirmando que el componente funciona correctamente [4:10].

La estructura queda clara: la vista index consume un componente Livewire, la lógica de la consulta vive en la clase del componente, y las relaciones se definen en los modelos Eloquent. Practica creando tu propio componente para familiarizarte con cada archivo involucrado y comparte en los comentarios cómo te fue con el ejercicio.