Laravelのバリデーションエラーメッセージの表示方法と日本語化

by

in

Laravelでバリデーションエラーが発生した際にエラーメッセージを表示する方法や日本語化の設定方法について解説します。

本記事では執筆時の最新バージョンであるLaravel10系のドキュメントを参考に紹介していきます。

エラーメッセージの表示方法

Laravelのバリデーション設定は通常、以下のように設定することができます。

<?php
 
namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
 
class PostController extends Controller
{
    /**
     * 入力フォームの表示ページ
     */
    public function create(): View
    {
        return view('post.create');
    }
 
    /**
     * フォームに入力された情報を元に作成を実行
     */
    public function store(Request $request): RedirectResponse
    {
        $validated = $request->validate([
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        $post = /** ... */
 
        return to_route('post.show', ['post' => $post->id]);
    }
}

$request->validate() を実行する事でバリデーションをする事ができ、問題がないと確認できた値が $validated 変数に格納されています。

この時に検証ルールを通過しない場合には検証前のページ、つまり入力フォームに自動的にリダイレクトされます。その際に全ての検証エラーと入力内容がセッションに書き込まれているため表示する事ができます。

以下のコードでエラーメッセージの表示が可能になります。

<!-- /resources/views/post/create.blade.php -->
 
<h1>Create Post</h1>
 
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
 
<!-- Create Post Form -->

上記のコードでは、$errors->any()を使用してエラーメッセージが存在するかどうかをチェックしています。

存在する場合は、$errors->all()を使用してすべてのエラーメッセージを取得し、リストアイテム(<li>)として表示します。

$errors 変数は Illuminate\Support\MessageBag クラスのインスタンスなので他にも以下のような使い方ができます。

$errors = $validator->errors();

// 複数エラーメッセージの最初の1件を表示
echo $errors->first('email');

// 複数エラーメッセージの一覧で foreach
foreach ($errors->get('email') as $message) {
    // ...
}

// 入れ子になっていたパラメータの一覧で foreach
foreach ($errors->get('attachments.*') as $message) {
    // ...
}

// エラーが存在すれば処理の実行
if ($errors->has('email')) {
    // ...
}

上記はPHPとしての実行方法をサンプルとして記載しました。Bladeテンプレートで表示する場合には適切な記述方法に変更してください。

@error ディレクティブを使用

Laravelフレームワークの標準で使われている Blade テンプレートを使用していれば @error ディレクティブを使用することができます。

<!-- /resources/views/post/create.blade.php -->
 
<label for="title">Post Title</label>
 
<input id="title"
    type="text"
    name="title"
    class="@error('title') is-invalid @enderror">
 
@error('title')
    // @error で囲むと $message 変数が自動的に宣言されます。
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

<input ... class="@error('title', 'post') is-invalid @enderror">

エラーメッセージを個別に表示したり、入力フォームのclassを個別に変更する場合に使用できます。

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

エラーメッセージは検証に失敗したバリデーションルールによって自動的に生成されて表示する事ができます。

ですが、英語表記がデフォルトになっているため、プロジェクトによっては日本語化をする必要があります。

日本語化については翻訳ファイルを作成する方法もありますが、Laravel Lang を使う方法がお手軽なので推奨します。

$ composer require laravel-lang/common --dev
$ php artisan lang:add ja
$ php artisan lang:update

上記の実行で翻訳ファイルがインストールされるので、 config/app.php ファイルの言語設定でインストールした日本語化ファイルを読み込むように変更しましょう。

    'locale' => 'ja',

これでエラーメッセージの日本語化が完了します。

こちらはプロジェクト全体のメッセージ日本語化ですが、個別にメッセージの表示を変えたい場合にはバリデーション実行時に設定する方法もあります。

        $validated = $request->validate([
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ],
        [
            'title.required' => 'タイトルは必須入力です',
            'title.unique:posts' => 'タイトルが重複しています',
            'title.max:255' => '文字数は255文字以内で入力してください',
            'body.required' => '内容は記入する必要があります',
        ]);

入力パラメータの日本語化

エラーメッセージ自体の日本語化は上記の設定で完了しましたが、入力パラメータの日本語化までは実行できていないので対応していきます。( title や body などのキー名です。)

前述の翻訳ファイルの attributes に追記すればプロジェクト全体の共通値として設定されます

    'attributes' => [
        'title' => 'タイトル',
        'body' => '内容',
        'email' => 'メールアドレス',
    ],

バリデーションの実行時に個別に設定することもできます。

        $validated = $request->validate([
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ],
        [],
        [
            'title' => 'タイトル',
            'body' => '内容',
        ]);

番外: 入力フォームにリダイレクトさせない場合

$request->validate() を実行すれば検証に失敗した場合は自動的に入力フォームにリダイレクトして $errors 変数が宣言されている事を解説しました。

ですが、入力フォーム以外のページにリダイレクトする場合も記述することが可能で、エラーメッセージを引き継ぐためのサンプルが以下になります。

use Illuminate\Validation\Validator;

public function store(Request $request)
{
    $rules = [
        'name' => 'required',
        'email' => 'required|email',
    ];

    $messages = [
        'name.required' => '名前は必須です。',
        'email.required' => 'メールアドレスは必須です。',
        'email.email' => '有効なメールアドレスを入力してください。',
    ];

    $validator = Validator::make($request->all(), $rules, $messages);

    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator)->withInput();
    }

    // バリデーションが成功した場合の処理
}

withErrors() メソッドを使用することでリダイレクト先でも自動的に $errors 変数にエラーメッセージが宣言されるようになります。

終わりに

以上、Laravelバリデーションでのエラーメッセージの表示方法と日本語化の方法でした。

今回まとめた方法以外にも、Requestクラスを作成してバリデーションルールを記述する方法もありますが、公式ドキュメントを読みながら記述していくことをお勧めします。

https://laravel.com/docs/10.x/validation

この他にもバリデーションを使いこなす上で、実務経験から毎回使っている設定などをまとめた記事もあるのでよかったら参照してみてください。

レンタルサーバーを最大限使いこなすための方法

Laravelの記事を厳選して紹介

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA