Livewire Rompe con las convenciones de Redirecciones (Flash) en Laravel
Quería exponer otra crítica constructiva al ecosistema, porque a veces siento que, cuando estoy trabajando, ya sea con Livewire o directamente con la base de Laravel, simplemente lo hago para mantenerme dentro del flujo. Claro, también puedes anexar Inertia, aunque Inertia me parece un poquito más organizado… hasta que llegamos a la parte de compartir los datos, donde todo se vuelve una locura con el handleRequest. Pero bueno, lo que sea.
En este caso, estoy trabajando con un proyecto en Livewire, y lo vamos a comparar un poquito con un proyecto en Laravel, específicamente con una operación tan sencilla como actualizar un recurso y mostrar un mensaje tipo flash. Esto lo podemos hacer en cualquier framework web, y tiene la característica de que el mensaje solo dura un request; por lo tanto, si recargo la página, el mensaje desaparece. Así de simple.
Redirecciones en Laravel base: simple y elegante
El Laravel base es algo muy bonito. De hecho, lo puedes ver aquí:
$this->redirect()->back();
Hay muchas formas de hacerlo, pero esta que te muestro creo que es la más utilizada. Desde el objeto request, accedemos a la session, usamos flash y establecemos el mensaje. Así de simple.
También lo podemos hacer mediante una redirección. Aquí, por ejemplo, usamos redirect()->route(...). Hay varias formas y Laravel ha ido simplificando un poquito el proceso para hacerlo más amigable.
A mí, personalmente, siempre me gustó mucho esta forma: redirect()->back(), porque generalmente, cuando mostramos un mensaje flash, queremos volver a la página previa.
Por ejemplo, si estamos en la vista de crear o editar, cuando le damos a "save", vamos a otra ruta que procesa la petición, y luego regresamos a la misma para confirmar que todo salió bien.
Lo mismo pasa con la acción de eliminar. Y queda muy limpio y reutilizable: en vez de definir la ruta manualmente, simplemente usamos back() y listo.
Redirecciones y mensajes Flash en Livewire: una pequeña pesadilla
Pero en Livewire, la cosa se vuelve una pequeña pesadilla. Esa es un poco la crítica: no podemos aplicar estas sintaxis tan bonitas. Aquí ya se vuelve todo un poco más lioso.
Por ejemplo, no accedemos directamente al request para usar la sesión y luego flash, sino directamente a la session.
Aquí establecemos el mensaje, pero no lo podemos configurar directamente desde la ruta, tal como te mostraba en el ejemplo anterior del libro. No se puede hacer de esa forma.
Obviamente, esta es una forma reducida. Lo que usamos en Livewire sería más manual, y seguramente existen otras alternativas, pero esta es la que yo conozco:
session()->flash('status', __("Category successfully saved."));
return $this->redirect(url()->previous());
Porque —otra vez— para una sola tarea, ¡existen como 10 formas distintas! Y estas son solo algunas.
Entonces, sí… es un poco lioso.
Pero lo peor no es que existan muchas formas, eso incluso puede ser bueno. El problema es que no funcionan bien.
Cuando las cosas no funcionan...
Por ejemplo, en Lware, si intento hacer una redirección desde otro punto —no desde donde Laravel espera—, el mensaje flash por alguna razón deja de funcionar.
Aquí, en mi caso, no tenía errores. Aunque me decía que había un error, era simplemente que la variable tir no existía en el ámbito del componente.
Corregí eso y usé redirect directamente. Y aún así, el mensaje flash ya no funciona.
Entonces, pues nada. Pudiera dar más ejemplos, pero esto es básicamente lo que quería comentar: se hace bastante pesado tener que estar reinventando la rueda, buscando cómo demonios hacer que funcione como se espera.
Literalmente, cuando estaba haciendo esta adaptación, tardé como media hora solo para lograr que se mostrara el bendito mensaje flash.
Acepto recibir anuncios de interes sobre este Blog.
Hablo sobre los problemas de configurar redirecciones y mensajes Flash en Lararavel Livewire y su uso en Laravel Base.
- Andrés Cruz