lunes, 11 de mayo de 2020

Rules, validaciones personalizadas en Laravel

Laravel ya nos ofrece gran cantidad de validaciones para emplear en las request, pero muchas veces nos puede surgir la necesidad de crear una propia. Se hará mediantes Rules y el comando de artisan para crear una nueva sería:
php artisan make:rule MyRule

Se creará el archivo MyRule.php dentro de la carpeta app/Rules con el siguiente contenido:
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class MyRule implements Rule
{
   /**
   * Create a new rule instance.
   *
   * @return void
   */
   public function __construct()
   {
      //
   }

   /**
   * Determine if the validation rule passes.
   *
   * @param string $attribute
   * @param mixed $value
   * @return bool
   */
   public function passes($attribute, $value)
   {
      //
   }

   /**
   * Get the validation error message.
   *
   * @return string
   */
   public function message()
   {
      return 'The validation error message.';
   }
}

Dentro de la funcción passes() es donde escribiríamos nuestra validación, que tendrá que devolver true o false dependiendo si la pasa o no.

A modo de ejemplo, vamos a modificar MyRule para que verifique que un número A es mayor que otro número B. Una validación que se podría hacer con la validaciones que trae Laravel, pero que vamos a realizarla a modo explicativo:
namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class MyRule implements Rule
{
    private $number_a;
    private $number_b;

   /**
   * Create a new rule instance.
   *
   * @return void
   */
   public function __construct($number_a, $number_b)
   {
       $this->number_a = $number_a;
       $this->number_b = $number_b;
   }

   /**
   * Determine if the validation rule passes.
   *
   * @param string $attribute
   * @param mixed $value
   * @return bool
   */
   public function passes($attribute, $value)
   {
      return $number_a > $number_b;
   }

   /**
   * Get the validation error message.
   *
   * @return string
   */
   public function message()
   {
      return 'El numero A no es mayor que el B';
   }
}
El constructor de la regla recibirá dos parámetros que serán los números a verificar. La funcción passes() devuelve el resultado de la comparación de los dos valores. Por último, la funcción message() devuelve el texto del error.

Para usar nuestra nueva regla, lo haríamos de la siguiente forma en la request:
public function rules()
{
   return [
      'number_a' => ['required', 'integer', new MyRule($this->number_a, $this->number_b)],
   ];
}
Al campo number_a de la request, ademas de que sea requerido e integer, le agregamos nuestra regla MyRule. Pasándole al constructor los dos valores a comprobar, que en este caso serán dos parámetros de la propia request, number_a y number_b.

No hay comentarios :

Publicar un comentario