วิธีตรวจสอบอาร์เรย์ใน Laravel


114

ฉันพยายามตรวจสอบความถูกต้องของอาร์เรย์ POST ใน Laravel:

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

        ]);

ฉันส่งว่าง POST และได้รับนี้เป็นif ($validator->fails()) {} Falseหมายความว่าการตรวจสอบความถูกต้องเป็นจริง แต่ไม่ใช่

วิธีตรวจสอบอาร์เรย์ใน Laravel เมื่อฉันส่งแบบฟอร์มกับinput name="name[]"

คำตอบ:


263

สัญลักษณ์ดอกจัน (*) ใช้เพื่อตรวจสอบค่าในอาร์เรย์ไม่ใช่ตัวอาร์เรย์

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

ในตัวอย่างด้านบน:

  • "ชื่อ" ต้องเป็นอาร์เรย์ที่มีอย่างน้อย 3 องค์ประกอบ
  • ค่าในอาร์เรย์ "ชื่อ" ต้องเป็นสตริงที่แตกต่างกัน (ไม่ซ้ำกัน) โดยมีความยาวอย่างน้อย 3 อักขระ

แก้ไข:ตั้งแต่ Laravel 5.5 คุณสามารถเรียกใช้วิธี validate () ได้โดยตรงบนวัตถุที่ร้องขอดังนี้:

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

1
$request->validate([...])อย่าลืมที่จะวางไว้ในการจับลองถ้าคุณกำลังใช้ จะมีข้อยกเว้นเพิ่มขึ้นหากข้อมูลไม่ผ่านการตรวจสอบความถูกต้อง
Daisura99

จะรับข้อความแสดงข้อผิดพลาดของฟิลด์เฉพาะได้อย่างไร? เช่นฉันมีชื่อ 2 ช่องแล้วเป็นช่องที่สองที่มี แต่ข้อผิดพลาดฉันจะบรรลุได้อย่างไร
Eem Jee

1
ไม่จำเป็นต้องระบุ 'ชื่อ. *' เนื่องจากจะตรวจสอบได้ก็ต่อเมื่อมีอยู่เท่านั้น
Ben Gooding

นี่เป็นสิ่งที่ยอดเยี่ยม ผมสงสัยว่าทำไมมีตัวอย่างในเรื่องนี้ไม่มีเอกสารที่เป็นทางการของการตรวจสอบอาร์เรย์
Binar Web

44

ฉันมีอาร์เรย์นี้เป็นข้อมูลคำขอของฉันจากตาราง / ตารางข้อมูล HTML + Vue.js:

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

และใช้สิ่งนี้เพื่อตรวจสอบว่าสิ่งใดทำงานได้อย่างถูกต้อง:

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

2
นี่คือสิ่งที่ฉันต้องการ!
Chris Stage

19

วิธีที่แนะนำในการเขียนตรรกะการตรวจสอบความถูกต้องและการอนุญาตคือการใส่ตรรกะนั้นในคลาสคำขอแยกต่างหาก วิธีนี้รหัสคอนโทรลเลอร์ของคุณจะยังคงสะอาด

php artisan make:request SomeRequestคุณสามารถสร้างระดับการร้องขอโดยการดำเนินการ

ในแต่ละrules()วิธีการร้องขอคลาสกำหนดกฎการตรวจสอบของคุณ

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

ในตัวควบคุมของคุณเขียนฟังก์ชันเส้นทางของคุณดังนี้:

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

คลาสคำร้องขอแต่ละคลาสมาพร้อมกับ hooks / method ก่อนและหลังการตรวจสอบความถูกต้องซึ่งสามารถปรับแต่งตามตรรกะทางธุรกิจและกรณีพิเศษเพื่อปรับเปลี่ยนพฤติกรรมปกติของคลาสคำร้องขอ

คุณสามารถสร้างคลาสคำขอพาเรนต์สำหรับคำร้องขอประเภทเดียวกัน (เช่นwebและapi) คำร้องขอจากนั้นสรุปตรรกะการร้องขอทั่วไปบางอย่างในคลาสพาเรนต์เหล่านี้


7

ข้อมูลที่ซับซ้อนขึ้นเล็กน้อยการผสมผสานระหว่างคำตอบของ @ Laran และ @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
   }
]

กฎการตรวจสอบจะเป็น

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

4

คุณต้องวนลูปเหนืออาร์เรย์อินพุตและเพิ่มกฎสำหรับแต่ละอินพุตตามที่อธิบายไว้ที่นี่: กฎการวนซ้ำ

นี่คือรหัสบางส่วนสำหรับคุณ:

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

10
ไม่จำเป็นต้องทำเช่นนั้น - laravel.com/docs/5.4/validation#validating-arrays
Filip Sobol

0

รหัสด้านล่างทำงานให้ฉันกับอาร์เรย์ที่มาจากการโทรของ ajax

  $form = $request->input('form');
  $rules = array(
            'facebook_account' => 'url',
            'youtube_account' => 'url',
            'twitter_account' => 'url',
            'instagram_account' => 'url',
            'snapchat_account' => 'url',
            'website' => 'url',
        );
        $validation = Validator::make($form, $rules);

        if ($validation->fails()) {
            return Response::make(['error' => $validation->errors()], 400);
        }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.