Validación de cadenas de Laravel para permitir cadenas vacías

3 minutos de lectura

En Laravel 5.7 estoy usando la validación de solicitud de formulario:

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'string|max:50'
    ];
}

Si envío una solicitud a mi API con esta carga útil:

{
  "age": 24,
  "title": ""
}

Laravel devuelve el error:

{
    "message": "The given data was invalid.",
    "errors": {
        "title": [
            "The title must be a string."
        ]
    }
}

Espero que pase la validación, ya que el título es una cadena, aunque esté vacía. ¿Cómo debe formularse la validación para permitir cadenas vacías?

  • Intenta agregar el present o required validador también

    – ka_lin

    22 de febrero de 2019 a las 15:38


  • @ka_lin Presente y obligatorio no describen esta propiedad, que no necesita estar presente y no es obligatoria.

    – Pegamento pera

    22 de febrero de 2019 a las 15:41

necesitarías nullable para permitir una cadena vacía

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'nullable|string|max:50'
    ];
}

  • nullable: el campo bajo validación puede ser nulo. Esto es particularmente útil cuando se validan elementos primitivos como cadenas y números enteros que pueden contener valores nulos.

    – ka_lin

    22 de febrero de 2019 a las 15:38

  • Esto no permite una cadena vacía, simplemente ignora una cadena vacía, tratándola como null. ¿Qué pasa si queremos sobrescribir el existente? title campo con una cadena vacía?

    – Pegamento pera

    22 de febrero de 2019 a las 15:40

  • @GluePear si quisiera hacer eso, también necesitaría deshabilitar \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class de su middleware. Ese middleware convertirá automáticamente las cadenas vacías en nulas. Desde el punto de vista de la normalización de la base de datos, sería mejor tener null como el valor en lugar de una cadena vacía de todos modos.

    – Jorge Hanson

    22 de febrero de 2019 a las 15:51

  • Confirmo que esto funciona. Si deja ese campo específico vacío, nullable hace pasar estando vacío. Aquí están los documentos.

    – Patros

    2 de julio de 2020 a las 0:18

Prueba a ver si ConvertEmptyStringsToNull el middleware está activo, entonces explicaría este comportamiento, consulte documentos

  • Gracias, eso es útil. No estoy seguro de eliminar ese middleware en caso de que se use en otro lugar. Pero explica el comportamiento.

    – Pegamento pera

    22 de febrero de 2019 a las 15:51

hay present gobierne que verifique el presente de una llave pero deje que esté vacía.

#presente

presente El campo bajo validación debe estar presente en los datos de entrada pero puede estar vacío.

https://laravel.com/docs/5.7/validation#rule-present

Intentaré

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'string|sometimes'
    ];
}

Esto solo validará el título cuando esté presente.

Evitar tocando la configuración de Middleware.

En su lugar, use la función incorporada de Laravel para manipular los datos antes de que se ejecute la validación.

Clase de validación interna

protected function prepareForValidation()
    {
        if($this->title == null )
            $this->merge(['title'=>'']);
    }

Avatar de usuario de Anwar
Anwar

La respuesta aceptada no soluciona el problema cuando tiene esta regla:

return [
  "title" => "sometimes|string",
];

En este caso, debe especificar que la cadena es realmente “anulable” (incluso si el ConvertEmptyStringsToNull el middleware está activo, probado en Laravel 8.77.1)

Entonces este permitirá pasar una cadena vacía en la tecla “título”:

return [
  "title" => "sometimes|string|nullable",
];

¿Ha sido útil esta solución?