¿Cómo validar peticiones HTTP eficazmente en Laravel?
En el fascinante mundo del desarrollo web, las buenas prácticas son la clave para un código limpio y eficiente. Una de las etapas fundamentales en la creación de aplicaciones seguras y robustas es la validación de las peticiones HTTP. Vamos a explorar cómo hacerlo correctamente en Laravel, una herramienta que, a pesar de su flexibilidad, alienta a adoptar estándares de calidad en el código.
¿Qué implica la validación en Laravel?
La validación en Laravel se refiere a la aplicación de filtros sobre las peticiones HTTP para asegurarnos de que los datos que recibimos cumplen con ciertos criterios. Por ejemplo, cuando creamos un usuario, queremos asegurarnos de que el correo electrónico sea válido, que la contraseña tenga un mínimo de caracteres, y que el nombre sea un campo requerido. La validación previene que datos incorrectos o maliciosos entren a nuestra base de datos.
¿Cómo separamos el código para validar correctamente?
Anteriormente, muchas veces se implementó la validación directamente en los controladores. Sin embargo, la buena práctica sugiere separar esta lógica en archivos diferentes, elevando la calidad y mantenibilidad del código. Aquí vamos a crear un nuevo proyecto, configurar las rutas y vistas, y desarrollar un archivo específico para manejar la validación.
Crear Proyectos:
Abre un nuevo proyecto en Laravel. Puedes hacerlo desde tu terminal o consola.
Asigna un nombre relevante para identificarlo fácil y rápidamente, como Forvikue.
Configuración de Rutas:
Asegúrate de que las rutas estén configuradas adecuadamente en el archivo de rutas para que redirijan a las vistas o controladores correctos.
Aquí se utiliza la ruta para atender la lógica de guardado, empleando post.store.
Crear Formulario:
Desde las vistas, crea un formulario asociado a los campos que intentas validar, como el título.
Asegúrate de utilizar métodos seguros como CSRF para proteger las peticiones.
¿Cómo desarrollamos el archivo de validación?
La clave aquí es crear un Request Form, una clase especial en Laravel que alojará nuestras reglas de validación.
php artisan make:request PostRequest
Este comando en consola generará un archivo dentro de la carpeta Requests. Ahí, definimos las reglas de validación que serán usadas por el controlador.
Este simple fragmento asegura que el campo title es obligatorio antes de cualquier operación, como guardar datos.
¿Por qué es importante aislar la validación?
Separar la validación en un archivo distinto nos permite:
Reutilización de Código: Las reglas de validación pueden ser reutilizadas en múltiples controladores.
Código Limpio: Se evita la sobrecarga de lógica en los controladores, manteniendo el código más legible y fácil de depurar.
Escalabilidad: Facilita la modificación y crecimiento del proyecto, ya que la lógica está ordenada y bien definida.
Implementación y pruebas
Supongamos que ya realizaste los pasos anteriores. Al probar la aplicación, al enviar un formulario con un título vacío, el sistema no debería responder hasta que el requisito se cumpla.
Al utilizar estas técnicas, mantenemos nuestro controlador limpio, y nuestra aplicación robusta y segura. Laravel no solo ofrece flexibilidad, sino la opción de implementar las mejores prácticas. Implementarlas depende de nosotros, los desarrolladores.
Mantente motivado y sigue adaptando estas prácticas en tus desarrollos futuros para asegurar aplicaciones de alta calidad y mantenerte a la vanguardia en el desarrollo con Laravel.
<?php
use Illuminate\Support\Facades\Route;use App\Http\Controllers\PageController;Route::get('/',function(){returnview('post');});Route::post('post',[PageController::class,'store'])->name('posts.store');
laravel 8 cambia mucho el funcionamiento, me da guerra en ocasiones toca tomarle cariño a las malas.
Menos mal que andas por aqui. Gracias crack
Validación de datos (rutas, vistas, formularios y controladores)
Cuando hablamos de validación nos referimos a filtros de peticiones HTTP en un sistema.
dd() → Este método muestra en detalle que tiene una variable y detiene la aplicación.
La lógica de validación no debe de estar en el controlador, debe de estar en un Request. Para crear vamos a utilizar el comando:
php artisan make:request PostRequest
Y en el archivo vamos a cambiar el dato que retorna el método authorize() por True. Así:
<?phpclassPostRequestextendsFormRequest{publicfunctionauthorize(){returntrue;}publicfunctionrules(){return[// Aquí va la lógica];}}
dd() .- es equivalente a var_dump() de php puro.
Cuando creamos un Request tenemos la función rules() donde ponemos las validaciones, también podemos poner la función messages() donde podemos personalizar el mensaje que queremos que nos envié cuando haya algún error. Ya que cuando tenemos algún error al enviar el formulario, nos envía la información en ingles.
Ejemplo:
publicfunctionmessages(){return['title.required'=> 'Un titulo es requerido,'body.required'=>'Un mensaje es requerido',];}```
Es la suma de var_dump() y die(), traduce a "dump and die" :)
Gracias por la aclaración :)
para los que estan en laravel 8
use App\Http\Controllers\PostController;Route::post('post',[PostController::class,'store'])->name('posts.store');
Ey mano, agradecido con vos
Utilizando laravel 8.12 y siguiendo con el ejemplo de registro de usuarios, queda de la siguiente forma...
<?php
namespace App\Http\Requests;use Illuminate\Foundation\Http\FormRequest;classUserRequestextendsFormRequest{/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/publicfunctionauthorize(){returntrue;}/**
* Get the validation rules that apply to the request.
*
* @return array
*/publicfunctionrules(){return['name'=>'required','email'=>'required|email|unique:users','password'=>'required|min:8',];}}
haaa con pipes
Podemos utilizar en Visual Studio Code Laravel Blade Snippets, que nos ayuda a autocompletar el código.
Interesante, yo siempre hacía las validaciones desde el mismo controlador, ahora veo que se pueden dividir mucho más haciendo las validaciones en un archivo a parte:D
Para las personas que tengan problemas con el servidor, yo en mi caso no uso ninguno para este curso, solo uso el comando:
php artisan serve
el cual les abrira una ruta en localhost para usar el servidor
Solo la abren en su navegador y listo, ya pueden navegar en el proyecto
Para crear un archivo de Request desde la consola y la ayuda de Laravel ejecutamos el siguiente comando
Con respecto a las validaciones, ¿que validaciones colocar en el middleware y que validaciones colocar en la clase PostRequets?
En un middleware colocar validaciones como por ejemplo si se encuentra con sesión iniciada.
En Request que desde el formulario se haya capturado información y de forma correcta.
¿Se puede aplicar el aislamiento de validaciones cuando creo una API REST?
Claro! Es una excelente práctica realizar dichas validaciones a un sistema de Laravel basado en API REST.
Como crear los virtual hosts automáticamente?
usa laragon crea los host automaticamente
Una consulta, estoy comenzando con Laravel, pero respecto a las variables, o nombres de rutas, tiene ya establecido cuando va en plural y cuando en singular, por ejm en este caso post y post.
Espero puedan ayudarme a despejar esa duda.
Desconozco si Laravel tiene alguna documentación de buenas prácticas de codificación. Pero esto que comentas es bueno tenerlo en cuenta y saber cómo declararás tus variables o funciones, sobre todo si trabajas con un equipo.
Por lo general, las variables van a estar en singular, salvo que sean un array de datos. También tienes que decidir si utilizar Camel Case (Ej: nombreCurso) o separar palabras con un guion bajo (Ej: nombre_curso).
Son detalles que hacen a la buena calidad del código y es importante prestarle atención.
Saludos
Hola
Me parece interesante e muy sencilla la forma de validación de datos. Tengo una duda ¿Cuando validas un dato único como el email? para el tema de store funciona bien, pero para el tema de update podria dar problema al detectar que ya existe y no permitiendo la actualización.
¿Cómo lo manejas?
Usualmente veo que los sistemas manejan la actualización de correo por separado.
¿Alguna idea de como se deberia mejar la actualización y validación de datos únicos?
Deberia existir un Request solo para ese campo? lo validarias programaticamente?
Gracias
Hola
Laravel lo hace demasiado facil. Tendremos una unica validacion (miRequest) tanto para creacion como para actualizacion.
Solamente hay que especificar que el campo validado tiene una regla diferente en el caso de actualizacion del registro.
.
Y se lee asi:
.
mail => tiene que ser unico, EXCEPTO si es actualizacion
(EXCEPTO si ya tengo un id creado )
.
Lo que sucede es que no tengo proyectos con la nueva version para compartirte un codigo, pero generalmente se hacia asi (y en la documentacion actual no encuentro detalles sobre esto), pero es asi:
// Regla para creacion de registros'email'=>'unique:users,email_address',// Modificacion de la regla, para el caso que sea actualizacion'email'=>'unique:users,email_address,'.$userId,
en $userId, pasas el id del usuario actual, o el id de la tabla que estes validando, en el caso de una actualziacion no aplica la regla para ese campo especifico.
Hola de nuevo, (actualizacion).
La respuesta anterior es correcta en teoria, pero la sintaxis cambio, ya encontre en laversion 9 se usa el metodo ignore():
.
.
Encuentras mas informacion sobre su uso en el apartado:
++Forcing A Unique Rule To Ignore A Given ID++
Por qué mis poryectos los tengo que visualizar desde server.php y no directamente de la raíz?
por como tienes configurado xamp
Hola me gustaria saber la la diferencia entre el middleware y el formrequest, como se explico en el curso los dos se hacen con el fin de validar cosas antes de llegar al controlador.
con el middleware validas peticiones http, para proteger tus rutas; y el formrequest es para validar los datos que llegan en la petición.