Laravel: la validación de un número mayor que cero está fallando

4 minutos de lectura

Tengo que validar un campo de precio que debe ser mayor que cero (0,01 es válido), por lo que tengo la siguiente validación:

$request->validate([
            'product_price' => 'required|numeric|gt:0',
        ]);

El problema es que cuando ingreso una cadena en el campo ‘product_price’, aparece un error:

InvalidArgumentException Los valores bajo comparación deben ser del mismo tipo

¿porqué es eso? Quiero decir, estoy comprobando que debería ser numérico antes incluso de comprobar que es > 0

avatar de usuario
Tharindu Thisarasinghe

gt, gte, lt y lte se agregan en Laravel 5.6 y versiones posteriores, supongo que esa debe ser la razón por la que recibe el error. (Sin embargo, está funcionando para mí).

Creo que puedes intentar así

$request->validate([
    'product_price' => 'required|numeric|min:0|not_in:0',
]);

min:0 asegúrese de que el valor mínimo sea 0 y que no se permitan valores negativos. not_in:0 asegúrese de que el valor no pueda ser 0. Entonces, la combinación de ambas reglas hace el trabajo.

Puede definir mensajes de error significativos para ciertas reglas. (También puede lograr el mismo resultado usando expresiones regulares).

  • Todavía no he probado esto, pero creo que no funcionará para mí, ya que la pregunta establece claramente que 0.1 es un valor válido y su respuesta limita el valor inicial a> = 1

    – Sr. Cujo

    19 sep 2018 a las 9:00

  • 0.1 fue un ejemplo. Una vez más, tiene que ser mayor que cero, pero no es necesario reducir su punto de partida a un valor inicial, ya que 0,1, 0,01, 0,001… son todos valores válidos.

    – Sr. Cujo

    19 de septiembre de 2018 a las 9:04

  • Esta regla permite todos los números mayores que 0 y menores que 10000. Incluyendo los números decimales como 0.1, 0.001 y etc. ¿Es eso lo que quieres?

    – Tharindu Thisarasinghe

    19 de septiembre de 2018 a las 9:07

  • Lo siento, mi error, no leí bien la respuesta. Una pregunta, ¿se permite cero en su respuesta? Porque no debería. Perdón por preguntar, es que no podré probarlo hasta que llegue a casa

    – Sr. Cujo

    19 de septiembre de 2018 a las 9:15

  • ¡Funciona a las mil maravillas! Solo tengo que probarlo. De todas las soluciones que he visto en línea, la tuya es la más directa y limpia. Gracias

    – Sr. Cujo

    20 de septiembre de 2018 a las 2:01

avatar de usuario
effy

Puedo ver que ninguna de las otras respuestas ha abordado la verdadera razón por la que recibe este error, intentaré proporcionarle algunas ideas y una solución.

El problema aquí es que Laravel está probando todas las reglas de validación y no se detiene después del primer error de validación que en su caso es numeric (que falla ya que el valor proporcionado es una cadena), si lo hizo, el error con el gt al validador que se le proporciona un valor de cadena no se arrojaría ya que el validador ya salió después de la numeric error.

Para que Laravel detenga las comprobaciones de validación después de la primera regla de validación fallida, puede prefijar sus reglas de validación con el bail validador que básicamente le dice a Laravel que se detenga después del primer error.

El código resultante se vería así:

$request->validate([
    'product_price' => 'bail|required|numeric|gt:0',
]);

Tenga en cuenta que esta solución también hace que solo se devuelva un único error por campo, si en su interfaz de usuario generalmente muestra todos los errores para un campo en particular a la vez (en lugar de elegir solo el primero de la bolsa de mensajes), esta solución cambiaría eso.

Más información sobre el bail La regla de validación se puede encontrar aquí: https://laravel.com/docs/6.x/validation#rule-bail

Puedes probar de esta manera,

Antes de invocar la función Validator::make(), modifique el conjunto de reglas agregando el valor para comparar así:

use Illuminate\Support\Facades\Validator;

Validator::extend('greater_than', function ($attribute, $value, $otherValue) {
      return intval($value) > intval($otherValue[0]);
});

$validation = Validator::make($input, ['amount' => 'required|numeric|greater_than:0']);

Para mí, este código funciona en mi proyecto.

$validation_rules = array( 
                'user_id' => 'required|integer|gt:0',
                'type_id' => 'required|integer|gt:0',
            );
$validation = Validator::make($request->all(), $validation_rules);

Aquí, gt:0 comprueba si el número entero es mayor que cero.

Espero que esto funcione para usted. De lo contrario, verifique su versión de Laravel.

Para mí, este código funciona en mi proyecto,

use Validator;

 $rules = [
            'product_price' => 'required|gt:0',
        ];

$validator = Validator::make($request->all(), $rules);


if ($validator->fails()) {
  return response()->json(array('status' => false, 'msg' => $validator->errors()->first()));
            exit;
        }

¿Ha sido útil esta solución?