Post Top Ad

Your Ad Spot

martes, 8 de septiembre de 2020

Validación de Laravel

 Validación de Laravel


En nuestro último episodio cuando trabajamos con Laravel Form Class , pudimos agregar una gran funcionalidad a nuestra pequeña aplicación de blog RESTful. Vimos cómo Laravel Form Class facilitó la creación de formas con gran poder y eficiencia. También utilizamos el excelente marco de Bootstrap de Twitter para darle un poco más de sabor a la apariencia. Hay algo que debemos agregar a los formularios que hemos creado y sería Validación. La validación es muy importante para cualquier aplicación basada en web. Ciertamente no es bueno permitir que los usuarios envíen información en blanco, o peor aún, información maliciosa en nuestros formularios web. Al usar la validación, podemos superar esta molestia. ¡Saltemos a la validación de Laravel!


Antes de los días de gloria actuales de trabajar con Laravel, los creadores web necesitarían unir colecciones complejas de expresiones regulares en forma de javascript del lado del cliente, PHP del lado del servidor o una combinación de ambos. Francamente, siempre he encontrado la tarea de tener que crear toda esta validación repetitiva y un poco aburrida. Entonces, en lugar de hacer las cosas a la vieja usanza y tener la cabeza agitada por lidiar con las expresiones regulares siempre crípticas, simplemente podemos implementar la Clase de validación de Laravel y comenzar a rodar con una validación sólida en poco tiempo.


Validación de Laravel en el controlador

Podemos comenzar validando en el storemétodo del BlogpostsController . Vamos a preparar algo de validación usando la sintaxis fácil de Laravel de Facade :: verb , en este casoValidator::make

Lo que hacemos aquí es pasar una matriz, y cada clave de la matriz se asigna a un campo en la base de datos. El valor correspondiente para cada clave se refiere a algún tipo de validación . Hay muchas reglas que puede utilizar aquí. En nuestro caso solo vamos a usarrequiredpero si quisiéramos, podríamos usar cualquiera de las siguientes reglas disponibles para validar el tipo y valor de los datos que se insertarán en el campo dado en la base de datos: Requerido con, Imagen (Archivo), Requerido sin, Después de (Fecha), Entero, Tamaño, Expresión regular, Fecha, Dígitos, Alfa, URL activa, Requerido si, Tipos MIME, Diferente, URL, Dirección IP, Formato de fecha, Correo electrónico, Entre, Requerido con todo, Numérico, Antes de (Fecha), Único (Base de datos), Requerido, En, Igual, Alfanumérico, Guión alfa, Dígitos entre, Existe (Base de datos), Máx, Requerido sin todos, Confirmado, Mínimo, No incluido y Aceptado.

Cuando creamos una instancia de la clase Validation usando Validator::make, ahora tenemos acceso a dos métodos que tienen un nombre muy apropiado fails()passes()Podemos utilizar estos métodos para realizar la validación. Así que hagamos algo súper fácil al principio.

Agregaremos esto a nuestro BlogpostsController antes de crear una nueva instancia de un Blogpost.

Ahora, si intentamos enviar el formulario sin ingresar ningún dato, el navegador devolverá, '¡Oh, no, no lo hagas!'

Ok, esto es bastante débil. En lugar de devolver ese mensaje y simplemente dejar al usuario preguntándose qué hacer a continuación, deberíamos redirigir al usuario al formulario, volver a completar el formulario con los datos que envió y mostrar algunos mensajes de error en la pantalla que serían útiles para su. Cómo hacemos esto? Hacemos esto así:

Redirect::back()envía al usuario de vuelta, vuelve a withInput()llenar el formulario y withErrors()captura los mensajes de error, solo asegúrese de pasar $validation->messages()para que realmente funcione.

¡Excelente! Ahora, en la vista, necesitamos especificar un lugar para hacer eco de los errores en la pantalla. Dado que tenemos Twitter Bootstrap a través de cdn en nuestro archivo de diseño maestro, arrancaremos nuestros mensajes de error aquí para que el usuario esté al tanto de los problemas que está teniendo. Nuestrocreate.blade.phparchivo ahora se verá así:

Entonces, si seguimos adelante y navegamos http://you.rock/blogposts/createy luego presionamos el botón Crear publicación sin ingresar ninguna información en nuestro campo de título o cuerpo , el usuario verá esta pantalla amigable:

validación de formulario laravel

Se ve muy bien, está funcionando según lo diseñado. No completamos el campo Título o Cuerpo, por lo que recibimos el mensaje de que el campo del título es obligatorio y el campo del cuerpo es obligatorio . Vamos a cambiarlo un poco. Vamos a completar el campo del cuerpo, pero en nuestra distracción nos olvidaremos de completar el campo del título. Luego, presionaremos Crear publicación y veremos qué hacen nuestras reglas de validación actuales por nosotros.

validación de formulario laravel sin título

¡Esto es fantástico! Laravel se ocupa de forma inteligente con esto y alerta al usuario de que es necesario el campo de título , pero al mismo tiempo, vuelve a llenar el formulario para que el usuario no tiene que volver a escribir dolorosamente toda la parte posterior de texto en. Sorprendentemente, todavía vemos una gran cantidad de sitios web , algunos de empresas de grandes marcas , que no pueden realizar correctamente la validación de formularios simples. Claro, te alertarán si algo salió mal, pero ese mensaje de longitud novedosa que acabas de escribir en su formulario de envío de mensajes es ¡Puf! , Gone, Zip, Zilch, Nada, Bye Bye. No hay nada más molesto que los formularios que no se repoblan correctamente.


Validación de Laravel en modelo

En la sección anterior, hicimos funcionar nuestra validación con bastante facilidad. Simplemente creamos una instancia de la clase de validación en el store()método de BlogpostController y, como puede ver, todo parece funcionar bastante bien. Ese método es una excelente manera de poner las cosas en funcionamiento rápidamente cuando no está preocupado por el mejor patrón de diseño. Una vez que las cosas funcionen, podría tener sentido extraer la lógica de validación al modelo. Veamos cómo podemos lograr esto.

Definir reglas en el modelo

El primer paso es mover las reglas del BlogpostsController al Modelo de Blogpost . En lugar de eliminar el código por completo, simplemente lo comentaremos para que podamos ver fácilmente la diferencia.

Controlador

Modelo

Ahora hemos trasladado las reglas de validación al modelo y todo sigue funcionando igual que antes.

Cree un método estático en el modelo para validar

También podríamos limpiar el controlador moviendo la lógica a un método estático definido en el modelo, luego simplemente llamar a ese método desde el controlador, veamos eso ahora:

Modelo

Controlador

Ahora bien, esto es bastante hábil. Hemos trasladado la mayor parte de la lógica al modelo, y solo usamos un par de líneas simples de código en el store()método del controlador para completar la validación, y todo funciona como un campeón. Un pequeño inconveniente es que hicimos uso de métodos y propiedades estáticos para hacerlo. Esto va en contra de los señores supremos de la sociedad PHP, por lo que tendremos que arreglar eso.


Validación de Laravel mediante inyección de dependencia

Tal como está ahora, la validación está funcionando bien usando el código anterior. Sin embargo, podría hacerse mejor y más limpio utilizando la inyección de dependencia. Primero, sin embargo, ¿qué es la inyección de dependencia y por qué usarla? La inyección de dependencia es una forma de eliminar las dependencias codificadas de forma rígida y proporcionar la capacidad de realizar pruebas más fáciles y la capacidad de intercambiar implementaciones. Es un medio para inyectar el objeto necesario en el actual. La inyección de dependencias puede volverse un poco complicada si está creando instancias y pasando dependencias manualmente, pero afortunadamente el contenedor de Laravel IoC se encarga del trabajo pesado por nosotros.

Actualmente, en el store()método de BlogpostsController, hacemos referencia directamente al modelo de Blogpost a través de métodos y propiedades estáticos como se muestra aquí:

En su lugar, podemos inyectar una instancia del modelo Blogpost en el controlador a través de su constructor. Comencemos agregando este código al controlador:

Ahora que hemos inyectado una instancia del modelo Blogpost directamente en BlogpostsController , necesitaremos eliminar todas las referencias estáticas a esa clase y reemplazarla con la sintaxis más tradicional. De hecho, puede buscar en cualquier Blogpost :: y reemplazarlo con $ this-> blogpost-> , que actualizará nuestro controlador. No olvide eliminar el símbolo $ delante de sus variables al realizar este cambio. Cuando hace referencia a una variable de forma estática, se incluye. Un ejemplo es static :: $ messages vs $ this-> messages . Tenga en cuenta que en el ejemplo estático $ está presente, pero en el estilo de inyección de dependencia solo el$ esta palabra clave tiene el $ .

Si probamos el código actualizado, encontraremos que todas las funciones son iguales. El beneficio es que al usar la inyección de dependencia y dejar que Laravel maneje la creación de una instancia de objeto usando el contenedor de IoC, obtenemos un código que es más confiable, comprobable y flexible cuando se necesita un cambio en la implementación. El código completamente actualizado se ve así:

BlogpostsController (controlador)

Blogpost (modelo)

Por supuesto, este código podría hacerse más limpio que esto, pero el objetivo aquí era comenzar haciendo funcionar la validación básica. Una vez que hicimos funcionar la validación básica, pasamos a un estilo de mejores prácticas de inyección de dependencia. Con suerte logramos esos objetivos, ¡y creo que lo hicimos!

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas