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?
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 tenernull
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.
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'=>'']);
}
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",
];
Intenta agregar el
present
orequired
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