Laravel'de dizi nasıl doğrulanır?


110

Laravel'de POST dizisini doğrulamaya çalışıyorum:

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

        ]);

Boş POST gönderiyorum ve bunu if ($validator->fails()) {}olarak alıyorum False. Doğrulamanın doğru olduğu, ancak doğru olmadığı anlamına gelir.

Laravel'de dizi nasıl doğrulanır? İle formu gönderdiğimdeinput name="name[]"

Yanıtlar:


258

Yıldız işareti (*), dizinin kendisini değil dizideki değerleri kontrol etmek için kullanılır .

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

Yukarıdaki örnekte:

  • "isimler" en az 3 elemanlı bir dizi olmalıdır,
  • "names" dizisindeki değerler , en az 3 karakter uzunluğunda, farklı (benzersiz) dizeler olmalıdır.

DÜZENLEME: Laravel 5.5'ten bu yana validate () yöntemini doğrudan Request nesnesi üzerinde şöyle çağırabilirsiniz:

$data = $request->validate([
    "name"    => "required|array|min:3",
    "name.*"  => "required|string|distinct|min:3",
]);

1
kullanıyorsanız onu bir deneme yakalamasına yerleştirmeyi unutmayın $request->validate([...]). Veriler doğrulamada başarısız olursa bir istisna ortaya çıkar.
daisura99

belirli bir alanın hata mesajı nasıl alınır? Sanki 2 alan adım var ve sonra sadece hata olan ikinci alan, ona nasıl ulaşabilirim?
Eem Jee

'ad. *' üzerinde gerekli olan bilgi, yalnızca varsa doğruladığı için gerekli değildir
Ben Gooding

41

Bir HTML + Vue.js veri ızgarasından / tablosundan istek verilerim olarak şu diziye sahibim:

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

Ve bunu hangisinin düzgün çalıştığını doğrulamak için kullanın:

$this->validate($request, [
    '*.item_id' => 'required|integer',
    '*.item_no' => 'required|integer',
    '*.size'    => 'required|max:191',
]);

2
Tam da ihtiyacım olan şey bu!
Chris Stage

19

Doğrulama ve yetkilendirme mantığını yazmanın önerilen yolu, bu mantığı ayrı istek sınıflarına koymaktır. Bu şekilde denetleyici kodunuz temiz kalacaktır.

Çalıştırarak bir istek sınıfı oluşturabilirsiniz php artisan make:request SomeRequest.

Her istekte sınıfın rules()yöntemi doğrulama kurallarınızı tanımlayın:

//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
    ]
  ];
}

Denetleyicinizde rota işlevinizi şu şekilde yazın:

// 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.
}

Her istek sınıfı, istek sınıfının normal davranışını değiştirmek için iş mantığına ve özel durumlara dayalı olarak özelleştirilebilen ön ve son doğrulama kancaları / yöntemleri ile birlikte gelir.

Benzer türden istekler (örneğin webve api) istekler için ebeveyn istek sınıfları oluşturabilir ve daha sonra bu ebeveyn sınıflarında bazı ortak istek mantığını kapsülleyebilirsiniz.


6

@ Laran'ın ve @Nisal Gunawardana'nın yanıtlarının karışımı biraz daha karmaşık veriler

[ 
   {  
       "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
   }
]

Doğrulama kuralı olacak

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

4

Girdi dizisi üzerinde döngü oluşturmalı ve burada açıklandığı gibi her girdi için kurallar eklemelisiniz: Döngü Kuralları

İşte sizin için bir kod:

$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 */ 
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.