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();
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.
También me gusta esta forma, siento que se ve todo mas claro.
Yo en mi caso personal, prefiero usarlo así 😅
->with(['variale' => $variable])
Me ha pasado que cuando usaba compact, y si esta variable no existia, la aplicación seguía corriendo normalmente y era código basura :/, en with en cambio, se te cae la app si legases a eliminar o dejar de usar una variable.
Con livewire no podemos utilizar una api rest, es apropiado usar livewire y tener todo con php?
Depende, si sabes que tu aplicación va a ser consumida solamente por un cliente web, entonces si, livewire es la mejor opción. Si tu aplicación va a ser consumida por diferentes clientes; lo mejor es un API.
Livewire convive dentro del mismo proyecto backend, por eso no es necesario hacerlo. Sin embargo, si vas a conectarte desde distintos clientes (App móvil o algún proyecto front fuera del proyecto de laravel, entonces sí sería necesario un api rest
Componente Livewire
Podemos crear componentes con livewire, pero necesitamos usar el siguiente comando:
php artisan make:livewire *nombreComponente*
Y este dentro de 📁 views → livewire creará los componentes, además de crear un lugar donde alojar nuestros componentes en 📁 app → Http → Livewire . Para llamarlos dentro de otro archivo vamos a escribir
Uhhh me gusta cómo maneja Laravel los componentes, prácticamente hay un controlador por cada componente 🤔
.
Mirando los snippets que me proporciona VSCode veo que también se pueden importar scripts y styles usando estos componentes, me pregunto cómo manejara Laravel los requests a cada componente... 🤔
Ya me gustaba laravel, ahora me gusta mas!
Ojo con la sintaxis
<liveware:course-list>
que no tira error.
la manera correctar de llamar el componente sería:
@livewire('name-component')
no en forma de etiqueta, aunque funciona y no da error no es como expone la documentación oficial.
En realidad la documentación oficial menciona que hacer el render en forma de etiqueta es la forma más básica, pero como mencionas otra opción es con la directiva @livewire.
¿Exactamente qué hace el método ->with('user') en el CourseList.php? Intenté hacer la consulta sin ese método y me funcionó de igual manera. No me queda muy claro para qué se utiliza.
Hola Christian. La consulta con el método with se utiliza en caso de que se desee utilizar algún dato de la relación curso-usuario. Por ejempo course->user->name (esto sería el nombre del usuario que creó el curso).
Traer la relación de usuarios con cada curso.
Como hago debugger con laravel 8?, antes lo hacia con dd, pero ahora no sirve :(
¡Hola!, dd() aún sirve en Laravel 8, ¿te muestra algún error?, ¿por qué dices que no te funciona? 🤔
Si ya vi la nueva forma en que laravel muestra los mensajes, es que hay mucho cambio de la versión 5.4 a la 8
A la hora de hacer la prueba del curso, hay un error con respecto a la ubicación de los archivos de Livewire
Porque te permitiria implementar vue o react muy facil dentro de laravel.
.
Y lo mas importante que livewire a hecho para el ecosistema laravel:
.
Te habilitaria de manera facil y rapida el manejo de peticiones ayncronas dentro de laravel.
Como soliciono este error
Exception
Property [get] does not exist on the Eloquent builder instance. (View: C:\xampp\htdocs\j-livewire-8\resources\views\index.blade.php)
Alguien conoce algún curso usando daisyUI para Tailwind?
No conocia daisyUI, me parece una herramienta genial.
Para usar daisyUI sobre tailwind (ya sea con laravel u otra tecnologia), solo debes instalar daisyUI con npm y luego agregar daisyUI a la configuracion de tailwind en el archivo tailwind.config.js
module.exports={plugins:[require('daisyui'),],}
Súper daisyUI! Estoy mirando la página oficial y me parece muy interesante. Voy averiguar más! Muchas gracias.