Laravel-String-Validierung, um leere Strings zuzulassen
Lesezeit: 2 Minuten
In Laravel 5.7 verwende ich die Formularanforderungsvalidierung:
public function rules()
{
return [
'age' => 'integer',
'title' => 'string|max:50'
];
}
Wenn ich eine Anfrage mit dieser Nutzlast an meine API sende:
{
"age": 24,
"title": ""
}
Laravel gibt den Fehler zurück:
{
"message": "The given data was invalid.",
"errors": {
"title": [
"The title must be a string."
]
}
}
Ich würde erwarten, dass es die Validierung besteht, da der Titel eine Zeichenfolge ist, wenn auch eine leere. Wie sollte die Validierung formuliert werden, um leere Zeichenfolgen zuzulassen?
Versuchen Sie, die hinzuzufügen present oder required auch Validator
– ka_lin
22. Februar 2019 um 15:38 Uhr
@ka_lin Vorhanden und erforderlich beschreiben diese Eigenschaft nicht, die nicht vorhanden sein muss und nicht erforderlich ist.
– LeimBirne
22. Februar 2019 um 15:41 Uhr
Du bräuchtest nullable einen leeren String zuzulassen
public function rules()
{
return [
'age' => 'integer',
'title' => 'nullable|string|max:50'
];
}
nullable – Das validierte Feld kann null sein. Dies ist besonders nützlich beim Validieren von Grundelementen wie Zeichenfolgen und Ganzzahlen, die Nullwerte enthalten können.
– ka_lin
22. Februar 2019 um 15:38 Uhr
Dies erlaubt keine leere Zeichenfolge, dies ignoriert einfach eine leere Zeichenfolge und behandelt sie als null. Was ist, wenn wir die vorhandene überschreiben möchten title Feld mit einer leeren Zeichenfolge?
– LeimBirne
22. Februar 2019 um 15:40 Uhr
@GluePear Wenn Sie das tun möchten, müssen Sie es auch deaktivieren \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class von Ihrer Middleware. Diese Middleware konvertiert leere Zeichenfolgen automatisch in Null. Aus Sicht der Datenbanknormalisierung wäre es besser, es zu haben null als Wert und nicht als leere Zeichenfolge.
– Georg Hanson
22. Februar 2019 um 15:51 Uhr
Ich bestätige, dass dies funktioniert. Wenn Sie dieses bestimmte Feld leer lassen, nullable lässt es passieren, leer zu sein. Hier sind die Dokumente.
– Pathos
2. Juli 2020 um 0:18 Uhr
Versuchen Sie zu sehen, ob ConvertEmptyStringsToNull Wenn Middleware aktiv ist, würde dies dieses Verhalten erklären, siehe Dokumente
Danke, das ist nützlich. Ich bin nicht zuversichtlich, diese Middleware zu entfernen, falls sie an anderer Stelle verwendet wird. Aber es erklärt das Verhalten.
– LeimBirne
22. Februar 2019 um 15:51 Uhr
Es gibt present Regel in diesem Scheck Vorhandensein eines Schlüssels, aber lassen Sie es leer sein.
#gegenwärtig
vorhanden Das zu validierende Feld muss in den Eingabedaten vorhanden sein, kann aber leer sein.
public function rules()
{
return [
'age' => 'integer',
'title' => 'string|sometimes'
];
}
Dadurch wird der Titel nur validiert, wenn er vorhanden ist.
Vermeiden Berühren von Middleware-Einstellungen.
Verwenden Sie stattdessen die eingebaute Laravel-Funktion, um Daten zu manipulieren, bevor die Validierung ausgeführt wird.
Innerhalb der Validierungsklasse
protected function prepareForValidation()
{
if($this->title == null )
$this->merge(['title'=>'']);
}
Anwar
Die akzeptierte Antwort behebt das Problem nicht, wenn Sie diese Regel haben:
return [
"title" => "sometimes|string",
];
In diesem Fall müssen Sie angeben, dass die Zeichenfolge tatsächlich “nullable” ist (auch wenn die ConvertEmptyStringsToNull Middleware ist aktiv, getestet auf Laravel 8.77.1)
Dieser erlaubt es also, eine leere Zeichenfolge an die “Titel” -Taste zu übergeben:
Versuchen Sie, die hinzuzufügen
present
oderrequired
auch Validator– ka_lin
22. Februar 2019 um 15:38 Uhr
@ka_lin Vorhanden und erforderlich beschreiben diese Eigenschaft nicht, die nicht vorhanden sein muss und nicht erforderlich ist.
– LeimBirne
22. Februar 2019 um 15:41 Uhr