1

Mensajes de validaciones personalizados con Respect/Validation

Luego de leer un poco la documentación de respect/validation logre hacer que los mensajes de exception puedan ser personalizados(aunque no se si lo hice de la mejor manera, si alguien lo puede hacer de una manera más “limpia”, que deje su comentario, me interesa saber esa forma en la que lo hizo). Vamos allá entonces:

Paso 1:

Vamos a instalar respect/validation, esto es muy fácil, tan solo tendremos que ejecutar el siguiente comando desde la terminal en la carpeta de nuestro proyecto:

$ composer require respect/validation

Paso 2:

Luego de la instalación vamos a ir a nuestra clase(controlador) donde queramos aplicar estas validaciones e importaremos los siguientes namespace:

useRespect\Validation\Validator as v;
useRespect\Validation\Exceptions\NestedValidationException;

Esto que acabamos de importar por así decirlo es tan solo:

  • La manera como haremos las validaciones (la parte del “as” es opcional es tan solo un alias pero bien podemos quitarlo y todo funcionara, solo que en lugar de “v” usaremos “Validator”)

  • Y la manera como manejaremos las excepciones.

  • Puedes encontrar más información: aquí, en la documentación oficial

Paso 3:

Recuerdas como Hector, capturaba los archivos que enviábamos por post verdad? (Si no lo recuerdas has click aquí), te lo comento por que es super importante, ya que lo estaremos usando para las validaciones; Bueno continuemos, en uno de nuestros métodos ya declarados haremos lo siguiente:

public function setSaveJobAction($request){
		
		if ($request->getMethod() == "POST") { 
			$postData = $request->getParsedBody();
			
			$jobsValidator = v::key('title', v::notEmpty())
                  ->key('description', v::notEmpty());
		}

}

No te asustes, ya te explico que significa ese if, tan solo estamos evaluando que el método de envió sea POST y adentro de ese if estamos guardando en la variable $postData (en forma de arreglo) los datos que vienen del formulario mediante el método getParseBody(), luego tenemos la variable $jobsValidator que en ella es donde haremos las validaciones de los inputs de nuestro formulario. En este caso mi formularo tan solo tenia 2 inputs que eran: title y description. (muy importante el key, ya que esto lo utilizamos por que manejamos los datos en forma de arreglo)

Paso 4:

Luego dentro de ese mismo if, vamos a añadir un try catch, que nos servirá para mandar alertas al usuario por si existe un problema o por si todo esta ok.

try {
		$jobsValidator->assert($postdata);

		$job = new Job;
		$job->title = $postdata["title"];
		$job->description = $postdata["description"];
		$job->save();
		
		$responseMessage = ["Trabajo añadido"];
			
		} catch(NestedValidationException $exception) {
			    
				$responseMessage = $exception->findMessages([
					'notEmpty' => '{{name}} es un campo obligatorio'
				]);
				
}

Explico rápidamente: nuestra variable $jobsValidator hará uso de el método assert() que recibe como parámetro el arreglo que hace relación a los campos que validamos hace un momento. Luego estoy creando otra variable en forma de arreglo llamada $responseMessage quien será la que yo mande a la vista para darle la notificación al usuario. En el catch estamos haciendo uso de NestedValidationException qué cómo les dije nos ayudara con las excepciones. Igualo esa excepcion a mi variable responseMessage y se viene la parte interesante: estaremos haciendo uso del método findMessages, que le estaremos pasando por un arreglo, la validación que hicimos y el mensaje que queremos que salga. La parte del {{name}} es propia de respect/Validaton y estará tomando el valor del name que declaramos en nuestros inputs.

Paso 6:

Afuera del if retornamos nuestra variable a la vista

return $this->renderHTML("addJob.twig", [
			'responseMessage' => $responseMessage
]);

Paso 7:

En nuestra vista colocaremos nuestra alerta, ya que mandamos fue un arreglo entonces haremos un ciclo for, para recorrer todos esos posibles errores que tenemos:

{% if responseMessage != null %}<divclass="alert alert-{% if responseMessage[0] == 'Trabajo añadido' %}success{% else %}danger{% endif %}">{% for errors in responseMessage %}{{ errors }}{% endfor %}</div>{% endif %}

El primer if es tan solo por que cuando yo cargo mi formulario declaro que la variable responseMessage sea null, para que no me muestre la alerta si no hasta después que se quiera enviar información.

Y bueno eso fue todo espero te haya servido 😉

Escribe tu comentario
+ 2