Laravelでのバリデーション(値チェック)の方法を紹介します。
#サンプルblade
<div class="wrapper">
@if(count($errors) > 0)
<ul class="bg-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
@endif
<form action="{{ route('sample.store') }}" method="post">
@csrf
<div class="form-group">
<label>名称<span class="required">※必須</span></label>
<input type="text" name="name" class="form-control">
</div>
<div class="form-group">
<label>チェックボックス<span class="required">※必須</span></label>
<div class="checkbox">
<label class="checkbox-inline">
<input type="checkbox" name="checkbox[]" value="1">A
</label>
<label class="checkbox-inline">
<input type="checkbox" name="checkbox[]" value="2">B
</label>
<label class="checkbox-inline">
<input type="checkbox" name="checkbox[]" value="3">C
</label>
</div>
</div>
<div class="form-group">
<label>ラジオボタン<span class="required">※必須</span></label>
<div class="radio">
<label class="radio-inline">
<input type="radio" name="radio" value="1">A
</label>
<label class="radio-inline">
<input type="radio" name="radio" value="2">B
</label>
<label class="radio-inline">
<input type="radio" name="radio" value="3">C
</label>
</div>
</div>
<button type="submit" class="btn btn-success">登録</button>
</form>
</div>
#バリデーションルール作成
以下のコマンドを実行します
$ php artisan make:request ValidateSample
すると、以下のファイルが作成されます。
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ValidateSample extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return false;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
];
}
}
まず、authorize
メソッドのreturn false
をreturn true
に修正します。
(本来は権限チェックが必要な場合は、ここでチェックすることもできます。でも他の箇所ですることが多いです。)
では、rules
メソッドの中を書いていきます。
public function rules()
{
return [
'name' => 'required|max:30',
'checkbox' => 'required',
'radio' => 'required',
];
}
連想配列のキーが、html側のnameと一致させるように書きます。
連想配列の値に適用したいルールを書きます。
ルールはこちらの「使用可能なバリデーションルール」を参照。
(使うものはだいたい限られますが)
続いて、作成したルールが適用されるようにControllerを修正します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\ValidateSample; //★追加★
class SampleController extends Controller
{
...
public function store(ValidateSample $request) //★もともとRequestだった箇所をValidateSampleに置き換え★
{
...
では、画面から登録ボタンを押してみましょう。
あ!エラーメッセージが英語だったぞ...
エラーメッセージを日本語化する場合は、こちらから日本語ファイルを持ってくると便利です。
(今回、関係あるのはvalidation.php
だけですが...)
配置する場所はresources/lang/ja
の中です。
いや、ちょっと英語残ってるやんけ。
というわけで、先程作成したバリデーションファイルにattributes
メソッドを追加します。
public function attributes()
{
return [
'name' => '名称',
'checkbox' => 'チェックボックス',
'radio' => 'ラジオボタン',
];
}
連想配列のキーにhtmlのname属性、値に日本語訳をつっこみます。で、登録!
よし!日本語なった!
あー、でも、もうちょっと親切なメッセージにしたいぜ。というそこのアナタ!
messages
メソッドを追加しましょう。
public function messages()
{
return [
'checkbox.required' => 'チェックボックスは最低1つはチェックを入れてください。',
];
}
連想配列のキーに、htmlのname属性と、さらに.
でつなげて、バリデーションの値を書きます。
連想配列の値はフルメッセージです。
#おわりに
基本的にwebシステムなどを作成するときは、JavaScriptとphp両方でバリデーションすると思いますので、あまりphpのエラーメッセージは重要視されないかもしれませんが...
JavaScriptでやれば、エラーメッセージを対象の項目の下に出すのも楽ですからね。(私はVue.jsを使用しています)
マスター関連とかは、めんどくさくなってphpだけにしちゃったりしますので、そういうときに結構役立つかも。
そういえば、エラーになったときに、前回の入力値はどうやって表示するの?という疑問を持った方のための記事も作成する予定です。