LoginSignup
55
54

More than 3 years have passed since last update.

【laravel】バリデーションエラーの表示と編集

Last updated at Posted at 2020-05-04

概要

laravelではいくつかの方法でバリデーションをかけることができます。
そのため一度に投稿するとボリュームが多くなるので複数回に分けます。

・validateメソッドによるバリデーション
・FormRequestによるバリデーション
・Validatorによるバリデーション
・ruleオブジェクトによる検証ルールの追加

エラーメッセージの表示

バリデーションエラー時に返されるメッセージの表示はビューでの処理のみで対応できます。
このエラーメッセージはIlluminate\Support\MessageBagのインスタンスであるerrors変数へフラッシュデータとして保存されます。
errors変数はIlluminate\View\Middleware\ShareErrorsFromSessionによりビューへ結合されているため、バリデーションの記述方法に関係なく、いつでも共通してビューの中で$errors変数が使えます。

また、フラッシュデータは現在と直後のHTTPリクエストの間だけセッションにデータを保存して、それ以降は削除するというセッションのflashメソッドの保存方法です。

全てのエラーメッセージをまとめて表示する

errors変数は連想配列として保存されているため$errors->all()を@foreachで取得すればまとめて表示することができます。

views
@foreach ($errors->all() as $error)
  <li>{{$error}}</li>
@endforeach

// 記述方法:$errors->all()

特定のエラーメッセージを表示

エラーメッセージはまとめて表示するより、フィールドごとにエラーメッセージを表示した方が見やすいですよね。
そういう時は$errors->first('項目名')で指定した項目の最初の値を取得します。
この時の注意点はif ($errors->has('項目名'))でエラーメッセージの有無を確認してから記述することです。
$errors->has('項目名')はエラーメッセージの有無チェックするbool型のメソッドで、エラーメッセージがあればtrueを返します。

views
@if ($errors->has('name'))
  <li>{{$errors->first('name')}}</li>
@endif

// 記述方法:$errors->first('項目名')
// ただし、$errors->has('項目名')により値の有無を確認する

複数のエラーメッセージを表示する

先程のfirestメソッドは最初の値を取得するため複数のエラーメッセージを表示することができません。
エラーメッセージが複数発生する可能性があるフォームは$errors->get('項目名')
でエラーメッセージを取得します。
ただし、getメソッドの値は配列で取得されるためforeachでテキストとして取得する必要があります。

views
@if ($errors->has('age'))
<tr>
  <th>ERROR</th>
  @foreach($errors->get('age') as $message)
  <td> {{ $message }} </td>
  @endforeach
</tr>
@endif

// 記述方法:$errors->get('項目名')
// ただし、$errors->has('項目名')により値の有無を確認する

@errorで特定のエラーメッセージを表示

$errors->has('項目名')でエラーメッセージの有無を確認せずとも、@error('項目名')と記述することによりエラーメッセージの有無を確認して$messageへ値を渡すことができます。
この方法はhasメソッドとfirstメソッドと同じ要領で使用できます。
ifディレクティブによる記述を省略できるため可読性は上がりますがgetメソッドのように複数の値を取得できないことに注意です。

views
@error('name')
  <li>{{$message}}</li>
@enderror

// 記述方法:@error('項目名')、$massage

エラーメッセージの日本語化

日本向けのサービスでエラーメッセージが英語だと不親切なので日本語にします。

日本語言語の準備

まず、日本語の言語フォルダを用意します。
ここではresources/langにあるenフォルダをコピペしてjaと名前を変えるだけで大丈夫です。
langディレクトリにはバリデーション以外にもログインなどで表示するメッセージが保存されています。

また、GitHubに日本語言語のファイルセットがあるのでjaディレクトリだけ作成して、中身のファイルはクローンして作成すると楽に日本語化の準備ができます。
この方法の場合は次の段落は飛ばして大丈夫です。
Laravel 日本語言語ファイルセット

ディレクトリ
resources
├─ lang
|  ├─ ja

バリデーションメッセージを日本語へ

コピペしてフォルダ名を変えたja内にvalidation.phpがあります。
この中身を以下のリンクの内容へコピペします。
validation.php言語ファイル
これで日本語化の準備は完了です。

validation.phpに記述されている内容がバリデーションメッセージとして表示されるため、オリジナルのエラーメッセージを追加することもできます。
エラーメッセージの追加はruleオブジェクトによる検証ルールの追加 / resourcesのlangに登録で簡単に紹介しています。

ロケールの設定

config/app.phpのlocale設定を変更します。
ここでは使用する言語ディレクトリを指定しています。
ロケールにはlocalefallback_localeがありますがlocaleの設定のみを変更します。
fallback_localelocaleでメッセージの用意がない場合などで使用されるのでデフォルトのままにしておくのが無難と思います。
以上で日本語化の完了です。

ディレクトリ
config
├─ app.php
validation
// 中略
'locale' => 'en', // ここを'ja'へ
validation
// 中略
'locale' => 'ja',

localefallback_localeともに言語設定のないものに変更したらvalidation.requiredのようなエラーメッセージとなりました。
一応何かしらの表示は処理されるようですが、バリデーションの検証ルールが表示されるのはよくないですね。

共通のバリデーションメッセージを編集する

resources/langで設定した言語のディレクトリ内のvalidation.phpを編集します。
直接ルールごとにエラーメッセージを編集することもできますが、ここではcostom配列内で編集していきます。
costom配列に記述することにより、検証する値を連想配列のキーとして、その値に対応するルールごとにエラーメッセージを作成できます。

検証ルールの例
$validate_rule = [
  'name' => 'required',
  'age' => 'integer | between:0,150',
  'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
];
validation.php(メッセージ)
// ...中略...
'custom' => [
  'age' => [
    'numeric' => '整数で入力してください',
    'between' => '0~150で入力してください' 
  ],
  'sex' => [
    'regex' => '男か女で入力してくださいい' 
  ],

],
// 中略...
表示例
name(required):The name field is required.
age(integer):整数で入力してください
age(between):0~150で入力してください
sex(max:1):The sex may not be greater than 1 characters.
sex(regex:/^[男|女]+$/u):男か女で入力してください

検証ルールごとにメッセージを編集

validation.php
// ...中略...
'custom' => [
  'attribute-name' => [
    'rule-name' => 'custom-message',
  ],
],
// 中略...

参考

Laravel 6.x バリデーション / バリデーションエラー表示
Laravel 6.x バリデーション / 言語ファイルでカスタムメッセージ指定
Laravel 6.x validation.php言語ファイル
入門者のためのLaravelのValidationとエラーメッセージ / エラーメッセージの日本語化
エラーメッセージの日本語化
Laravel 日本語言語ファイルセット

55
54
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
54