Reglas de validación de Laravel: opcional, pero validado si está presente

3 minutos de lectura

Avatar de usuario de GTMeteor
GTMeteoro

Estoy tratando de crear una validación de actualización de usuario a través del formulario, donde paso, por ejemplo, ‘contraseña’ => NULL, o ‘contraseña’ => ‘nueva’;

Estoy tratando de hacer que se valide SOLO si se pasa como no nulo, y nada, ni siquiera ‘a veces’ funciona:/

Estoy tratando de validar como:

Validator::make(
    ['test' => null], 
    ['test' => 'sometimes|required|min:6']
)->validate();

Pero no se valida.

  • O usas sometimes o required. Son mutuamente excluyentes. Si solo usa a veces, se validará si no está vacío.

    – Marco Aurelio Deleu

    18 de febrero de 2017 a las 18:58

  • Si pero sometimes también hace que la prueba falle si el valor se pasa como NULL:/ Supongo que el problema radica en pasar valores NULL…

    – GTMeteoro

    18 de febrero de 2017 a las 19:45


Tal vez estabas buscando ‘anulable’?

'test'=> 'nullable|min:6'

avatar de usuario de nixxx
nixxx

Aunque la pregunta es un poco antigua, así es como debes hacerlo. No necesitas esforzarte tanto, con tanto código, en algo tan simple.

Necesita tener ambos anulables y, a veces, en la regla de validación, como:

$this->validate($request, [
  'username' => 'required|unique:login',
  'password' => 'sometimes|nullable|between:8,20'
]);

Lo anterior validará solo si el campo tiene algún valor, e ignorará si no lo tiene, o si pasa nulo. Esto funciona bien.

avatar de usuario de sumit
sumar

No pase ‘requerido’ en el validador

Validar como abajo

$this->validate($request, [
    'username' => 'required|unique:login',
    'password' => 'between:8,20'
]);

El validador anterior aceptará la contraseña solo si está presente, pero debe tener entre 8 y 20

Esto es lo que hice en mi caso de uso.

case 'update':
                $rules = [
                            'protocol_id' => 'required',
                            'name' => 'required|max:30|unique:tenant.trackers'.',name,' . $id, 
                            'ip'=>'required',
                            'imei' => 'max:30|unique:tenant.trackers'.',imei,' . $id, 
                            'simcard_no' => 'between:8,15|unique:tenant.trackers'.',simcard_no,' . $id, 

                            'data_retention_period'=>'required|integer'
                         ];  
            break;

Aquí el rastreador puede o no tener un número de tarjeta SIM, si está presente, tendrá entre 8 y 15 caracteres incorrectos.

Actualizar

si aún desea pasar el valor ‘NULL’ codificado, agregue lo siguiente en el validador

$str="NULL";
$rules = [
    password => 'required|not_in:'.$str,
];

  • él está enviando nulo a propósito si el campo está vacío. por lo que su respuesta no funciona! Esa fue mi primera respuesta, así que la actualicé.

    – lewis4u

    18 de febrero de 2017 a las 20:23


  • Cierto, pero él no está usando laravel como lo hacen todos los demás… está enviando todos los valores a pesar de que no están poblados… así que con su solución nulo se valida y no tiene más de 6 chars y muestra un error de validación!!!

    – lewis4u

    18 de febrero de 2017 a las 20:27


  • Bueno, es un problema OP, y el tuyo también. El estilo de Laravel siempre es así… eres libre de votar negativamente 🙂

    – sumisión

    18/02/2017 a las 20:30

  • No me estás leyendo. ¡En laravel, si lo usa por la documentación, los campos de entrada vacíos no se envían con la solicitud! ¡Pero el OP lo ha personalizado para enviar un valor nulo cuando el campo de entrada está vacío! Y si configura la regla para verificar cualquier cosa: por ejemplo min:6 verificará el valor nulo en ese campo y el valor nulo no tiene suficientes caracteres y arrojará un error de validación.

    – lewis4u

    18 de febrero de 2017 a las 20:32

  • Obviamente es un principiante, pero yo también… se le ocurrirá con el tiempo 😉 (si continúa usando Laravel)

    – lewis4u

    18 de febrero de 2017 a las 20:48


creo que estas buscando filled.
https://laravel.com/docs/5.4/validation#rule-filled

Las reglas de validación relevantes son:

  • requerido
  • a veces
  • anulable

Todos tienen sus usos y se pueden consultar aquí:

https://laravel.com/docs/5.8/validation#rule-required

si quieres que la validación sea siempre aplicar

https://laravel.com/docs/5.8/validation#conditionally-adding-rules

si desea aplicar reglas de validación a veces

https://laravel.com/docs/5.8/validation#a-note-on-opcional-campos

si quieres que tu atributo permitir nulo como valor también

¿Ha sido útil esta solución?