この記事でできること
- バリデーションルールを外部のファイルから取り込むことができる
- バリデーションルールを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"
]
}