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:
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
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
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)
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.
Afuera del if retornamos nuestra variable a la vista
return $this->renderHTML("addJob.twig", [
'responseMessage' => $responseMessage
]);
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 😉