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.

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

Ich werde versuchen

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'=>'']);
    }

Benutzeravatar von Anwar
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:

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

1439890cookie-checkLaravel-String-Validierung, um leere Strings zuzulassen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy