今回もLaravel 5.6, 5.7の記事です。前回の記事で、FormRequestを用いてバリデーションルールを記述しました。
今回はバリデーションメッセージの表示、編集を行っていきましょう。
コントローラー、リクエスト、リソースファイルはこうなっています。
MembersController.php
1 2 3 4 5 6 7 8 9 |
/* * create member */ public function store(MembersRequest $request) { Member::create($request->validated()); return redirect()->to('members'); } |
create.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<form method="POST" action="/members"> {{ csrf_field() }} <div> <label for="name">名前</label> <input type="text" name="name" required> </div> <div> <label for="position">ポジション</label> <input type="text" name="position" required> </div> <div> <label for="height">身長</label> <input type="number" name="height" required> </div> <div> <input type="submit" value="送信"> </div> </form> |
MembersRequest.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required|string|max:100', 'position' => 'required|string|max:255', 'height' => 'required|numeric|digits_between:2,3', ]; } |
それではバリデーションエラーメッセージを記述しましょう。
バリデーションエラーメッセージの表示
create.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<form method="POST" action="/members"> {{ csrf_field() }} <div> <label for="name">名前</label> <input type="text" name="name" required> {{ $errors->first('name') }} </div> <div> <label for="position">ポジション</label> <input type="text" name="position" required> {{ $errors->first('position') }} </div> <div> <label for="height">身長</label> <input type="number" name="height" required> {{ $errors->first('height') }} </div> <div> <input type="submit" value="送信"> </div> </form> |
$errors変数を呼び出すことによって、対応したinputのエラーメッセージを表示することができます。
画像は名前に100文字以上、ポジションに255文字以上、身長に1桁を入力した場合のエラーメッセージです。
エラーメッセージは表示できましたが、元の入力値が消えてしまっているので、よくわからないですね。入力値を保持するようにしましょう。
入力値の保持
create.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<form method="POST" action="/members"> {{ csrf_field() }} <div> <label for="name">名前</label> <input type="text" name="name" required value="{{ old('name') }}"> {{ $errors->first('name') }} </div> <div> <label for="position">ポジション</label> <input type="text" name="position" required value="{{ old('position') }}"> {{ $errors->first('position') }} </div> <div> <label for="height">身長</label> <input type="number" name="height" required value="{{ old('height') }}"> {{ $errors->first('height') }} </div> <div> <input type="submit" value="送信"> </div> </form> |
value=”{{ old(‘name属性’) }}”をinputに追加します。old関数を使用することで、送信したリクエストを表示することができます。
これで入力値の保持、エラーメッセージの表示ができましたが、エラー文が英文ですので、日本語化しましょう。
エラーメッセージの日本語化
config/app.phpにlocale, fallback_localeを設定します。
1 2 |
'locale' => 'ja', // 日本語言語ファイルの呼び出し 'fallback_locale' => 'en', // 呼び出し用の日本語言語ファイルがない場合、英語ファイルを呼び出し |
日本語用言語ファイルを作成します。とりあえず英語ファイルをコピーしましょう。
1 |
$ cp -rf resources/lang/en/ resources/lang/ja/ |
コピーした言語ファイル、ja/validation.phpを翻訳していきましょう。翻訳済みメッセージはLaravelの公式ドキュメントに用意されていますので、そちらをコピペします。さあ、もう一度エラーを起こしてみます。
日本語になりました。しかし、attributeがまだ英語です。attributeを日本語化します。
validation.php追記
1 2 3 4 5 |
'attributes' => [ 'name' => '名前', 'position' => 'ポジション', 'height' => '身長', ], |
出来ました!
バリデーションメッセージはリクエスト毎にオーバーライドすることも可能です。
MembersRequest.php
1 2 3 4 5 6 7 8 9 10 11 |
/** * 定義済みバリデーションルールのエラーメッセージ取得 * * @return array */ public function messages() { return [ 'name.max' => '寿限無みたいな名前ですね', ]; } |
このリクエストだけメッセージを変えたい、というときはこちらで対応してください!
コメントを書く