PrepareForValidation, generar datos antes de validar los formularios en Laravel
Usualmente en las aplicaciones que manejan un campo para el slug, es generado internamente por otro campo, en este caso, el del título; en Laravel, podemos hacer este proceso de generar el slug automáticamente fácilmente mediante la función de prepareForValidation() en el cual hacemos el merge con el slug generado a partir del título usando el helper de ayuda slug() provisto por Laravel; recuerda que la función de prepareForValidation() se ejecuta antes de realizar las validaciones; así que, colocamos en ambos archivos de validaciones:
app/Http/Requests/Category/Store.php
app/Http/Requests/Category/Put.php
// ***
public function prepareForValidation()
{
if(str($this->slug)->trim() == "")
$this->merge([
'slug' => str($this->title)->slug()
]);
}
// ***
Transcripción del vídeo
Vamos a hacer una pequeña optimización para nuestro formulario y con esto literalmente nos agarramos el 50% del tiempo que va a gastar el usuario en trabajar con nuestro formulario que sería autogenerar el slot Ya que en el 99.9999% de los casos vamos a querer que el slot sea igual al título pero con su sintaxis correspondiente es decir to de minúscula y los espacios separados por guiones y removiendo las caracteres especiales Entonces eso lo podemos hacer muy fácilmente en Laravel convirtiéndolo en un stream y ya por ahí en las funciones de ayudas tenemos un método llamado slug que nos permite hacer justamente ese trabajo entonces para eso tenemos aquí un método muy interesante que se llama el de prepare for validation el cual hace justamente lo que indica su nombre él se va a ejecutar antes es decir está preparando la Data para las validaciones por lo tanto tal cual indica su nombre se va a ejecutar antes de lo que sería las validaciones que es lo que tenemos en el controlador es decir es una especie de middleware que se encarga de preparar la Data por lo demás aquí sería un poco la sintaxis aquí preguntamos si es vacío por lo tanto el usuario no lo suministró y en ese caso es cuando nosotros vamos a editarlo … hacemos aquí un merge tal cual puedes ver es decir estamos mezclando lo que tenemos actualmente recuerda que el merch hace referencia a mezclar mezclamos el request que ya tenemos con los cambios que estamos haciendo por acá y bueno Esto lo puedes aprovechar para hacer cualquier otro tipo de operación en caso de que sea necesario para ti.
Vamos a ampliarlo por acá digo por aquí por Dios por acá Entonces esto es lá el básico otra vez esto no tiene nada de inertia pero otra vez lo podemos emplear sin problemas vamos a ver si sale creo que no sale voy a escribirlo acá de igual manera prepare y no Bueno aquí hasta hasta llegó el autoayuda voy otra vez prepare for validation voy a quitar esto y Aquí hacemos un poco lo comentado … entonces para eso podemos emplear el método de trim.
Está marcando ahí el Así que lo metí aquí dentro es eso, me pasa por el zoom es de ser que aquí fuera se tuvo que aparecer No tampoco Bueno no sé okay Aquí está y aquí colocamos el slot y hacemos la magia colocamos aquí es otra vez porque vamos a convertir esto otra vez un objeto str del laravel le pasamos al title importante es el title el loot no te confundas ya que el title si estuviera lleno O tiene que estar lleno y aquí utilizamos la función o método aquí sería método des slot que hace lo comentado aquí también lo puedo buscar ya que está aquí abierta aquí está por aquí abajo y lo que hace es genera una URL amigable o limpia como yo llamo como yo le llamo para un campo llamado salut Ah bueno aquí también le puedes indicar cuál va a ser el carácter que por defecto es el guion para los espacios es decir esto espacio que está acá lo coloco Y eso sería ya Prácticamente todo por acá ahora falta probar si nuestra optimización está funcionando correctamente creo que voy a recargar acá voy a quitar esto aquí ya está el mismo así que voy a colocar aquí uno doy edit y reventó esto okay a ver qué haber pasado acá put merch no existe puse merch merch para ver merch ahora sí Bueno aquí Recuerda que no hay nada voy a recargar de igual manera quito esto y doy ya edit la URL ha sido tomada m creo que está intentando cambiar para la misma URL es curioso no se me ocurrido pero aún así no debería de cambiar bueno voy a a otro ejemplo a este a ver voy a quitar este doy edit y aquí sí la genero Bueno aquí voy a intentar colocar algo más interesante Bueno aquí fíjate importante si aquí hacemos un cambio en el título usualmente no queremos que cambiar el slug y es por eso la verificación que hicimos antes con el condicional y Okay Okay creo que sí tenemos un problema … con el slug Ok a la final quedé comprobando aquí con el sl para ver Ok Ok Ok sería el sl Yo creo que el ID es mejor colocar el ID que sería el que no cambiamos si definitivamente colocamos ahí el ID porque si colocamos el como estamos cambiando el parece que si da problema en fin Bueno aquí si lo quito ahí sí aparece Bueno tengo que recargar la página para Que aparezca el loot Y bueno ya puedes ver cómo Aquí también coloqué esto Ahí está y se cambio acá no va a cambiar el slot lo mantiene que es usualmente lo que queremos que no se cambio el slug cuando cambiamos el título por cuestiones deeo ya que esto se supone que va a ser una especie de Block Entonces es eso básicamente aquí ya la parte de la recarga para que aparezca aquí realmente hubiera que analizarlo bien bueno Esto lo vamos a dejar así porque ya cuando hagamos la redirección esto se solventa fácilmente ahorita es porque estamos haciendo aquí la operación hace casill ya pero esto lo arreglamos un poco más adelante así que pues nada vamos a la siguiente clase.
- Andrés Cruz
Este material forma parte de mi curso y libro completo; puedes adquirirlos desde el apartado de libros y/o cursos Curso y Libro Laravel 11 con Tailwind Vue 3, introducción a Jetstream Livewire e Inerta desde cero - 2024.
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter