【laravel】配列に対してバリデーションをする方法

laravelでフォームのバリデーションを実装していると、
「配列の値をどうやってバリデーションすればいいのかわからない」
と悩んだことはありませんか?

単一の値であれば問題なく書けるバリデーションも、
「input name=”XXX[]”」や配列形式になると急に難しく感じてしまいます。

この記事では、laravelで配列を扱う際のバリデーション方法を、
実例を交えながら紹介していきます。

目次

実装

実装の流れ

  • 同一の情報が複数含まれるフォームを作成する
  • 配列でのバリデーションを実装する

今回はルートは省略しております。

フォームの作成

inputタグのnameプロパティに「name=”XXX[]”」とし、配列でpostできるように設定します。

<h3>テストフォーム</h3>

{{-- メッセージ --}}
@foreach ($errors->all() as $error)
    <div style="color: red;">{{$error}}</div>
@endforeach

//  posttestメソッドへ
<form action="{{ route('posttest') }}" method="POST">
    @csrf
    <table>
        <tr>
        <th>ID</th>
        <th>名前</th>
        <th>年齢</th>
        </tr>
    @foreach ($dataList as $key => $data)
        <tr>
            <td>
                {{$data['id']}}
                //  name=XXX[]とし、配列でpostする
                <input type="hidden" name="id[]" value="{{$data['id']}}">
            </td>
            <td>
                //  name=XXX[]とし、配列でpostする
                <input type="text" name="name[]" value="{{old("name.$key", $data['name'])}}">
            </td>
            <td>
                //  name=XXX[]とし、配列でpostする
                <input type="text" name="age[]" value="{{old("age.$key", $data['age'])}}">
            </td>
        </tr>
    @endforeach
    </table>
    <input type="submit" value="送信">
</form>

oldヘルパーの第二引数に、初期表示するデータを指定します。

controller 配列バリデーション実装

配列に対してバリデーションをする方法は、バリデーションメソッドの連想配列のキーに「nameプロパティ.*」を定義するだけです。
例として、以下のフォームのように複数の同じ入力値に対してバリデーションをします。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BlogController extends Controller
{
    //  テストデータを作成
    public function gettest() {
        $dataList = Array(
            array('id' => 1, 'name' => '山田一郎', 'age' => 20),
            array('id' => 2, 'name' => '山田二郎', 'age' => 22),
            array('id' => 3, 'name' => '山田三郎', 'age' => 24),
            array('id' => 4, 'name' => '山田四郎', 'age' => 26),
            array('id' => 5, 'name' => '山田五郎', 'age' => 28),
        );

        return view('test', [
            'dataList' => $dataList
        ]);
    }

    //  bladeからのpost先
    public function posttest(Request $request) {
        //  バリデーション  name属性に「.*」をつける
        $validated = $request->validate([
            'id.*'   => 'required',
            'name.*' => 'required',
            'age.*'  => 'required|regex:/^[0-9]+$/'
        ]);

        return view('test');
    }
}
  • URLをコピーしました!
目次