【Laravel】バリデーションルールをJSONファイルから取り込む

プログラミング
この記事でできること
  • バリデーションルールを外部のファイルから取り込むことができる
  • バリデーションルールをJSONファイルの形式で記述できる
  • フォームの入力値によって、バリデーションルールを使い分けることができる
スポンサーリンク

入力フォーム

@extends('layouts.app')

@section('content')
<div class="container">
<form action="DynamicValidation" method="post">
    @csrf
    <table>
        <tr>
            <th>ID</th>
            <td>
                <input id="id" name="id" type="text" value="{{ old('id',$id) }}">
                @error('id')
                    <span class="alert alert-danger">{{ $message }}</span>
                @enderror
            </td>
        </tr>
        <tr>
            <th>値1</th>
            <td>
                <input id="value_1" name="value_1" type="text" value="{{ old('value_1',$value_1) }}">
                @error('value_1')
                    <span class="alert alert-danger">{{ $message }}</span>
                @enderror
            </td>
        </tr>
        <tr>
            <th>値2</th>
            <td>
                <input id="value_2" name="value_2" type="text" value="{{ old('value_2',$value_2) }}">
                @error('value_2')
                    <span class="alert alert-danger">{{ $message }}</span>
                @enderror
            </td>
        </tr>
    </table>
    <button type="submit">送信</button>
</form>
</div>
@endsection

コントローラー

<?php

namespace App\Http\Controllers\DynamicValidation;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Http\Requests\DynamicValidation\DynamicValidationPost;

class DynamicValidationController extends Controller
{
    public function index(Request $request)
    {
        return view('DynamicValidation.index')
        ->with([
            'id' => $request->session()->get('id'),
            'value_1' => $request->session()->get('value_1'),
            'value_2' => $request->session()->get('value_2')
        ])
    ;

    }

    public function post(DynamicValidationPost $request)
    {
        return redirect('DynamicValidation')
            ->with([
                'id' => $request->id,
                'value_1' => $request->value_1,
                'value_2' => $request->value_2
            ])
        ;
    }

}

FormRequest

<?php

namespace App\Http\Requests\DynamicValidation;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use Storage;

class DynamicValidationPost extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return array_merge(
            [
                'id' => [
                    'required',
                    Rule::in(['100', '200', '300'])
                ]
            ],
            $this->getRuleFiile($this->id)
        );
    }

    private function getRuleFiile($id)
    {
        if (! Storage::exists("Validation/${id}.json"))
        {
            return [] ;
        }
        $file = Storage::get("Validation/${id}.json");
        $json = json_decode($file,true);
        return $json;

    }
}

バリデーションルール(JSONファイル)

id=100の場合のバリデーションルール

{
    "value_1":[
        "required",
        "string"
    ],
    "value_2":[
        "required",
        "integer",
        "max:100"
    ]
}

id=200の場合のバリデーションルール

{
    "value_1":[
        "required",
        "string"
    ],
    "value_2":[
        "required",
        "integer",
        "max:200"
    ]
}
タイトルとURLをコピーしました