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.';
}
}
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.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';
}
}
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.
{
return [
'number_a' => ['required', 'integer', new MyRule($this->number_a, $this->number_b)],
];
}
No hay comentarios :
Publicar un comentario