Laravel에서 배열의 유효성을 검사하는 방법은 무엇입니까?


105

Laravel에서 어레이 POST의 유효성을 검사하려고합니다.

$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[]"

답변:


239

별표 기호 (*)는 배열 자체가 아니라 배열의 을 확인하는 데 사용 됩니다.

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

위의 예에서 :

  • "이름"은 요소가 3 개 이상인 배열이어야합니다.
  • "names"배열의 은 3 자 이상의 고유 한 (고유 한) 문자열이어야합니다.

편집 : Laravel 5.5부터 다음과 같이 Request 객체에서 직접 validate () 메서드를 호출 할 수 있습니다.

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

을 사용하는 경우 try catch에 넣어야합니다 $request->validate([...]). 데이터가 유효성 검사에 실패하면 예외가 발생합니다.
daisura99

특정 필드의 오류 메시지를 얻는 방법은 무엇입니까? 2 개의 이름 필드가 있는데 오류 만있는 두 번째 필드 인 것처럼 어떻게 얻을 수 있습니까?
Eem Jee

38

이 배열을 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

17

유효성 검사 및 권한 부여 논리를 작성하는 데 권장되는 방법은 해당 논리를 별도의 요청 클래스에 배치하는 것입니다. 이렇게하면 컨트롤러 코드가 깨끗하게 유지됩니다.

을 실행하여 요청 클래스를 만들 수 있습니다 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.
}

각 요청 클래스에는 요청 클래스의 정상적인 동작을 수정하기 위해 비즈니스 로직 및 특수 사례를 기반으로 사용자 정의 할 수있는 사전 및 사후 유효성 검사 후크 / 메서드가 함께 제공됩니다.

유사한 유형의 요청 (예 : webapi)에 대해 부모 요청 클래스를 만든 다음 이러한 부모 클래스에 몇 가지 공통 요청 논리를 캡슐화 할 수 있습니다.


6

조금 더 복잡한 데이터, @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 */ 
}

9
그렇게 할 필요가 없습니다 -laravel.com/docs/5.4/validation#validating-arrays
Filip Sobol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.