Làm cách nào để xác thực mảng trong Laravel?


104

Tôi cố gắng xác thực mảng POST trong Laravel:

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

        ]);

Tôi gửi POST trống và nhận được if ($validator->fails()) {}như thế này False. Nó có nghĩa là xác nhận là đúng, nhưng nó không phải là.

Làm cách nào để xác thực mảng trong Laravel? Khi tôi gửi biểu mẫu vớiinput name="name[]"

Câu trả lời:


238

Biểu tượng dấu hoa thị (*) được sử dụng để kiểm tra các giá trị trong mảng, không phải chính mảng.

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

Trong ví dụ trên:

  • "tên" phải là một mảng có ít nhất 3 phần tử,
  • các giá trị trong mảng "tên" phải là các chuỗi riêng biệt (duy nhất), dài ít nhất 3 ký tự.

CHỈNH SỬA: Vì Laravel 5.5 bạn có thể gọi phương thức validate () trực tiếp trên đối tượng Request như sau:

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

hãy nhớ đặt nó trong một nắm bắt thử nếu bạn đang sử dụng $request->validate([...]). Một ngoại lệ sẽ được đưa ra nếu dữ liệu không được xác thực.
daisura99

làm thế nào để nhận được thông báo lỗi của một trường cụ thể? như tôi có 2 trường tên, và trường thứ hai chỉ có lỗi, làm thế nào tôi có thể đạt được nó?
Eem Jee

38

Tôi có mảng này làm dữ liệu yêu cầu của mình từ lưới / bảng dữ liệu HTML + Vue.js:

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

Và sử dụng điều này để xác thực cái nào hoạt động đúng cách:

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

2
Đây chính xác là loại thứ tôi cần!
Chris Stage

17

Cách đề xuất để viết logic xác thực và ủy quyền là đặt logic đó trong các lớp yêu cầu riêng biệt. Bằng cách này, mã bộ điều khiển của bạn sẽ vẫn sạch.

Bạn có thể tạo một lớp yêu cầu bằng cách thực thi php artisan make:request SomeRequest.

Trong mỗi rules()phương thức của lớp yêu cầu, hãy xác định các quy tắc xác thực của bạ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
    ]
  ];
}

Trong bộ điều khiển của bạn, hãy viết hàm định tuyến của bạn như sau:

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

Mỗi lớp yêu cầu đi kèm với các móc / phương thức xác thực trước và sau xác thực có thể được tùy chỉnh dựa trên logic nghiệp vụ và các trường hợp đặc biệt để sửa đổi hành vi bình thường của lớp yêu cầu.

Bạn có thể tạo các lớp yêu cầu cha cho các loại yêu cầu tương tự (ví dụ webapi) các yêu cầu và sau đó đóng gói một số logic yêu cầu chung trong các lớp cha này.


6

Dữ liệu phức tạp hơn một chút, kết hợp câu trả lời của @ Laran và @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
   }
]

Quy tắc xác thực sẽ là

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

4

Bạn phải lặp lại mảng đầu vào và thêm các quy tắc cho mỗi đầu vào như được mô tả ở đây: Vòng Rules Over

Đây là một số mã cho ya:

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

9
Không cần phải làm điều đó - laravel.com/docs/5.4/validation#validating-arrays
Filip Sobol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.