Wie validiere ich ein Array in Laravel?

102

Ich versuche, Array POST in Laravel zu validieren:

$validator = Validator::make($request->all(), [
            "name.*" => 'required|distinct|min:3',
            "amount.*" => 'required|integer|min:1',
            "description.*" => "required|string"

        ]);

Ich sende einen leeren POST und erhalte diesen if ($validator->fails()) {}als False. Dies bedeutet, dass die Validierung wahr ist, aber nicht.

Wie validiere ich ein Array in Laravel? Wenn ich ein Formular mit abschickeinput name="name[]"

Darama
quelle

Antworten:

235

Das Sternchen (*) wird verwendet, um Werte im Array zu überprüfen , nicht das Array selbst.

$validator = Validator::make($request->all(), [
    "names"    => "required|array|min:3",
    "names.*"  => "required|string|distinct|min:3",
]);

Im obigen Beispiel:

  • "Namen" muss ein Array mit mindestens 3 Elementen sein.
  • Werte im Array "names" müssen eindeutige (eindeutige) Zeichenfolgen sein, die mindestens 3 Zeichen lang sind.

BEARBEITEN: Seit Laravel 5.5 können Sie die validate () -Methode direkt für das Request-Objekt aufrufen, wie folgt:

$data = $request->validate([
    "name"    => "required|array|min:3",
    "name.*"  => "required|string|distinct|min:3",
]);
Filip Sobol
quelle
Denken Sie daran, es in einen Versuchsfang zu legen, wenn Sie verwenden $request->validate([...]). Eine Ausnahme wird ausgelöst, wenn die Daten die Validierung nicht bestehen.
Daisura99
Wie erhalte ich die Fehlermeldung eines bestimmten Feldes? Wie ich habe 2 Namensfelder, und dann ist es das zweite Feld, das nur den Fehler hat, wie kann ich es erreichen?
Eem Jee
38

Ich habe dieses Array als meine Anforderungsdaten aus einem HTML + Vue.js-Datenraster / einer Tabelle +:

[0] => Array
    (
        [item_id] => 1
        [item_no] => 3123
        [size] => 3e
    )
[1] => Array
    (
        [item_id] => 2
        [item_no] => 7688
        [size] => 5b
    )

Und verwenden Sie dies, um zu überprüfen, welche ordnungsgemäß funktioniert:

$this->validate($request, [
    '*.item_id' => 'required|integer',
    '*.item_no' => 'required|integer',
    '*.size'    => 'required|max:191',
]);
Nisal Gunawardana
quelle
2
Das ist genau das, was ich brauchte!
Chris Stage
17

Die empfohlene Methode zum Schreiben von Validierungs- und Autorisierungslogik besteht darin, diese Logik in separate Anforderungsklassen einzuteilen. Auf diese Weise bleibt Ihr Controller-Code sauber.

Sie können eine Anforderungsklasse durch Ausführen erstellen php artisan make:request SomeRequest.

rules()Definieren Sie in der Methode jeder Anforderungsklasse Ihre Validierungsregeln:

//SomeRequest.php
public function rules()
{
   return [
    "name"    => [
          'required',
          'array', // input must be an array
          'min:3'  // there must be three members in the array
    ],
    "name.*"  => [
          'required',
          'string',   // input must be of type string
          'distinct', // members of the array must be unique
          'min:3'     // each string must have min 3 chars
    ]
  ];
}

Schreiben Sie in Ihren Controller Ihre Routenfunktion wie folgt:

// SomeController.php
public function store(SomeRequest $request) 
{
  // Request is already validated before reaching this point.
  // Your controller logic goes here.
}

public function update(SomeRequest $request)
{
  // It isn't uncommon for the same validation to be required
  // in multiple places in the same controller. A request class
  // can be beneficial in this way.
}

Jede Anforderungsklasse verfügt über Hooks / Methoden vor und nach der Validierung, die basierend auf Geschäftslogik und Sonderfällen angepasst werden können, um das normale Verhalten der Anforderungsklasse zu ändern.

Sie können übergeordnete Anforderungsklassen für ähnliche Arten von Anforderungen (z. B. webund api) erstellen und dann eine allgemeine Anforderungslogik in diesen übergeordneten Klassen kapseln.

sumit
quelle
6

Etwas komplexere Daten, eine Mischung aus den Antworten von @ Laran und @Nisal Gunawardana

[ 
   {  
       "foodItemsList":[
    {
       "id":7,
       "price":240,
       "quantity":1
                },
               { 
                "id":8,
                "quantity":1
               }],
        "price":340,
        "customer_id":1
   },
   {   
      "foodItemsList":[
    {
       "id":7,
       "quantity":1
    },
    { 
        "id":8,
        "quantity":1
    }],
    "customer_id":2
   }
]

Die Validierungsregel lautet

 return [
            '*.customer_id' => 'required|numeric|exists:customers,id',
            '*.foodItemsList.*.id' => 'required|exists:food_items,id',
            '*.foodItemsList.*.quantity' => 'required|numeric',
        ];
Prafulla Kumar Sahu
quelle
4

Sie müssen das Eingabearray durchlaufen und Regeln für jede Eingabe hinzufügen, wie hier beschrieben: Regeln durchlaufen

Hier ist ein Code für dich:

$input = Request::all();
$rules = [];

foreach($input['name'] as $key => $val)
{
    $rules['name.'.$key] = 'required|distinct|min:3';
}

$rules['amount'] = 'required|integer|min:1';
$rules['description'] = 'required|string';

$validator = Validator::make($input, $rules);

//Now check validation:
if ($validator->fails()) 
{ 
  /* do something */ 
}
Chad Fisher
quelle
9
Es ist nicht nötig, das zu tun - laravel.com/docs/5.4/validation#validating-arrays
Filip Sobol