この記事にはプロモーションが含まれています。

【Laravel11】バリデーションの実装方法やエラーメッセージのカスタマイズ

【Laravel11】バリデーションの実装方法やエラーメッセージのカスタマイズ

Laravelではバリデーションを簡単に実装する仕組みが用意されています。

この記事ではLaravelバージョン11でバリデーションを実装する方法をご紹介します。

この記事で分かること
  • Laravelバージョン11でバリデーションを実装する基本的な方法
  • バリデーションのエラーメッセージのカスタマイズ方法
  • フォームリクエストを利用して高度なバリデーションカスタマイズを行う方法
ケケンタ

Webアプリを開発するならバリデーション実装は必須です!
この記事が少しでもお役に立てば何よりです。




ケケンタ

ケケンタのITブログでは、WebアプリPHPLaravel)やWeb制作WordPressコーディング)について情報を発信しています。
学習中の方や実務をされている方など多くの方にアクセスいただいていますので、ぜひほかの記事も参考にしてみてください!


運動不足、気になっていませんか?

もしプログラミング学習やお仕事で運動不足が気になっているなら
連続屈伸運動がおすすめです!

ボタンにカーソルを合わせるだけ
カウントダウンが始まるタイマーをご用意してみました!

ケケンタ

無理のない範囲で、ぜひ隙間時間に屈伸運動を取り入れてみて下さい!

タイマースタート

3:00

※運動不足だと連続3分で取り組んでもかなり息が切れます
(僕は加えて気分もちょっと悪くなりました……)
絶対にご無理の無い範囲でお取り組みください!


目次

バリデーションとは?

まずは「そもそもバリデーションとは何か?」、 「その役割とは?」についてお伝えします。

バリデーションとは?

バリデーションとは、簡単にいうとユーザの入力値が意図した値になっているかどうかを検証することです。

そんなバリデーションの具体的な役割は以下の通りです。

バリデーションの役割
  • ユーザの入力値を制御することでWebアプリにおけるデータの整合性を保つ
  • 悪意あるユーザからのセキュリティ攻撃を予防する

バリデーションを実装することでWebアプリを安全に稼働できます。

逆にいえば、バリデーションを実装しないと、悪意あるユーザによるセキュリティ攻撃を素通りさせることになり、重要情報の漏洩などの被害が発生する危険性が高まります。

【基本】バリデーションの実装方法

本章よりLaravelバージョン11でバリデーションを実装する方法を解説します。

バリデーションの実装方法を解説する上で、入力フォームそこからの値を受け取りデータベースへ保存する処理などがあると話が進めやすいため、この記事では以下の例をイメージしながら解説していきます。

この記事で扱うWebアプリと処理の例

  • TODOアプリ
  • タスクの登録処理
ケケンタ

上記の例にそって、以下よりルーティングやコントローラーなどのソースコードをご紹介していきます!

ルーティング

// タスク登録ページを表示するルーティング
Route::get('/tasks/create', [TasksController::class, 'create'])->name('tasks.create');

// タスク登録処理を実行するルーティング
Route::post('/tasks/create', [TasksController::class, 'store']);

バリデーションルールの設定

/*
 * タスク登録ページ(create.blade.php)を表示
 */
public function create()
{
    return view('tasks.create');
}

/*
 * タスク登録処理
 */
public function store(Request $request, Task $task)
{
    // バリデーションルール(★)
    $validated = $request->validate([
        // 【形式】'$requestのキー名(name属性名)' => 'ルール1|ルール2……',
        'title' => 'required|max:50',
    ]);

    // タスク登録処理
    $task->title = $request->title;
    $task->save();

    return redirect()->route('tasks.index');  // タスク一覧ページへリダイレクト(※本記事ではページファイル省略)
}

上記の例では、title以下2つのバリデーションルールを適用しています。

上記のソースコードで適用しているバリデーションルール
  • required(入力必須)
  • max:50(50文字まで入力許可)

このように、Laravel11ではデータベースへの保存処理の前にバリデーションルールを記述することで、そのデータに対して簡単にバリデーションを実装することが可能です。

バリデーションエラーが発生した際に出力するエラーメッセージについては次節で解説します。

【日本語ドキュメント】https://readouble.com/laravel/11.x/ja/validation.html
参照項目:「使用可能なバリデーションルール」

エラーメッセージの出力

続いて、バリデーションによって入力エラーが発生したときに出力するエラーメッセージについて解説します。

Laravel11では日本語版エラーメッセージ用ファイルがデフォルトで用意されていません。
そのため、エラーメッセージを日本語で出力させるためには、後述するエラー内容をカスタマイズするの解説内容もあわせて対応する必要があります。

エラーメッセージの出力方法大きく2つあります。

バリデーションのエラーメッセージを出力する「2つ」の方法
  • エラーメッセージを項目ごとにひとつずつ出力する
  • 複数項目のエラーメッセージを一か所にまとめて出力する

方法① エラーメッセージを項目ごとにひとつずつ出力する

<form action="{{ route('tasks.create') }}" method="post">
    @csrf
    <p>
        @error('title')
            <div class="alert alert-danger">{{ $message }}</div>
        @enderror
        <label for="title">タイトル</label>
        <input type="text" name="title" value="{{ old('title') }}">
    </p>
    <input type="submit" value="登録">
</form>

@error('DB上のカラム名')を使用することで、該当項目のバリデーションエラーが発生したときにエラーメッセージを出力することが可能です。

また、value属性にold('name属性の値')のように記述しておくことで、エラー発生時に入力されていた値がフォームに保持されるようになります。
old('name属性の値')が無いとエラーが発生する度に入力内容が消えてしまい、再入力の手間が増えます。

方法② 複複数項目のエラーメッセージを一か所に出力する

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
<form action="{{ route('tasks.create') }}" method="post">
    @csrf
    <p>
        <label for="title">タイトル</label>
        <input type="text" name="title" value="{{ old('title') }}">
    </p>
    <input type="submit" value="登録">
</form>

@if ($errors->any())でエラーメッセージの有無をチェックしています。
もしバージョンエラーがあれば、@foreach ($errors->all() as $error)でループを回して、エラーメッセージをひとつずつ出力します。

また、value属性にold('name属性の値')のように記述しておくことで、エラー発生時に入力されていた値がフォームに保持されるようになります。
old('name属性の値')が無いとエラーが発生する度に入力内容が消えてしまい、再入力の手間が増えます。

このように、バリデーションエラーによるエラーメッセージの出力方法は大きく2つあります。

ケケンタ

ただ、エラーが発生した項目ごとにエラーメッセージを出力した方が、ユーザにとっても分かりやすいと思うので、個人的には①の方法を使用する機会が多いのではないかと思っています。

エラー内容をカスタマイズする

バージョンによりますが、前述したようにLaravel11ではデフォルトだとバリデーションのエラーメッセージ用のファイルが用意されていません。

本章では、そのファイルの用意方法を含め、エラーメッセージ・項目名のカスタマイズ方法を解説します。

STEP1 日本語向けのバリデーション用ファイルを用意する

php artisan lang:publish

上記のコマンドを実行すると、プロジェクトディレクトリ直下にlang/enディレクトリが生成されます。

このをenlang直下で複製し、そのディレクトリ名をjaとします。

enディレクトリ複製後のlangディレクトリ
enディレクトリ複製後のlangディレクトリ

このja内のvalidation.phpを編集することで、エラーメッセージを日本語対応させることが可能です。

なお前提として、プロジェクトディレクトリ直下の.envファイル内でAPP_LOCALE=jaとなっている必要があります。

※初期値は「en」になっており、この状態だとlang/enディレクトリが参照されてしまいます。

STEP2 エラーメッセージのカスタマイズ

エラーメッセージをカスタマイズするときは、ja内のvalidation.phpを編集するとお伝えしました。

例えば、requiredルールによるエラーメッセージを編集するときは以下のようにします。

// 変更前
'required' => 'The :attribute field is required.',

// 変更後
'required' => ':attribute は必須です。',

:attributeの部分には、エラーが発生した項目名が自動設定されます。

STEP3 項目名のカスタマイズ

エラーメッセージ上の項目名は、デフォルトだとデータベースで使用しているカラム名になります。

しかし、それでは「titleは必須です」のようなメッセージとなり、ユーザにとって分かりづらい内容になってしまいます。

ケケンタ

そこで、本節では項目名のカスタマイズ方法をご紹介します!

validation.phpの下の方にあるattributesへ、以下のように

キー名(DB上のカラム名) => ‘任意の項目名’」と記述することで項目名を簡単にカスタマイズできます。

'attributes' => [
    'title' => 'タイトル',
],

以上のように「バリデーション用ファイル」を用意することで、エラーメッセージが正常に出力されるようになります。

ケケンタ

カスタマイズも簡単にできますね!

高度なバリデーションの実装方法

Laravelにはフォームリクエストという、より複雑なバリデーションを実装できるクラスが用意されています。

より複雑なバリデーションシナリオの場合は、「フォームリクエスト」を作成することをお勧めします。フォームリクエストは、独自のバリデーションおよび認可ロジックをカプセル化するカスタムリクエストクラスです。フォームリクエストクラスを作成するには、make:request Artisan CLIコマンドを使用します。

引用元:Laravel11日本語ドキュメントhttps://readouble.com/laravel/11.x/ja/validation.html

基本的なバリデーション実装では、コントローラーの登録処理メソッド内にバリデーションルールを記載していました。

フォームリクエストを利用することで、バリデーション関係の処理をコントローラーから切り離し、なおかつ複雑なバリデーションの実装が可能になります。

ケケンタ

以下よりフォームリクエストを利用してバリデーションを実装する手順を解説します!

STEP1 フォームリクエストの作成

以下のコマンドを実行することでフォームリクエストファイルが作成されます。

php artisan make:request 任意のフォームリクエストファイル名

実行例

php artisan make:request StoreTaskRequest
フォームリクエストファイル生成後のファイル構造
フォームリクエストファイル生成後のファイル構造

STEP2 フォームリクエストファイルの編集

class StoreTaskRequest extends FormRequest
{
    /*
     * リクエストの認証制御
     * ※このメソッドをカスタマイズすることでリクエストの認証範囲を変更できますが、
     *  当記事では割愛します。
     */
    public function authorize(): bool
    {
        return true; // falseをtrueへ変更(★)
    }

    /*
     * バリデーションルール
     */
    public function rules(): array
    {
        return [
            'title' => 'required|max:50',
        ];
    }

    /*
     * バリデーションメッセージのカスタマイズ
     * (★)手動で追加
     */
    public function messages(): array
    {
        return [
            'title.required' => ':attribute の入力は必須です。',
        ];
    }
}

ポイントを解説します。

authorize()

authorize()リクエストの認証を制御するためのメソッドです。

デフォルトではfalseが返るようになっていますが、このままの状態だと403エラーが発生するため、ここをtrueへ変更してすべてのリクエストが認証されるようにします。

この記事では省略しますが、authorize()をカスタマイズすることでより正確な認証範囲の制御が可能になります。

rules()

rules()にはバリデーションルールを記載します。

【日本語ドキュメント】https://readouble.com/laravel/11.x/ja/validation.html
参照項目:「使用可能なバリデーションルール」

messages()

messages()バリデーションエラーが発生した際のエラーメッセージをカスタマイズするためのメソッドです。

このメソッドを利用することで、前項「エラー内容をカスタマイズする」でご紹介したvalidation.phpを使わなくてもエラーメッセージを個別にカスタマイズすることが可能です。

フォームリクエストを作成した時点では用意されていないため、手動で追加する必要があります。

メソッド名は「messages」とする必要がある点にご留意ください。

STEP3 コントローラーの編集

フォームリクエストファイルでバリデーションを実装したため、コントローラーにはバリデーション関係の処理を書く必要が無くなります。

/*
 * タスク登録処理
 */
// public function store(Request $request, Task $task)     // 変更前
public function store(StoreTaskRequest $request, Task $task)  // 変更後
{
    // バリデーションルール(★削除)
    // $validated = $request->validate([
    //     'title' => 'required|max:50',
    // ]);

    $task->title = $request->title;
    $task->save();

    return redirect()->route('tasks.index');
}

ひとつ注意点として、メソッドの引数にあるRequest型を、紐づけたいフォームリクエストの型に書き換える必要があります。

今回の例ではStoreTaskRequest型に書き換えています。

ケケンタ

このように、フォームリクエストを使用すればコントローラーからバリデーション処理を切り離すことができ、かつより細かな制御をすることができるようになります。

まとめ

以上が、Laravelバージョン11でバリデーションを実装する方法でした。

11以前のバージョンと書き方が同じ箇所もあるかと思いますが、大きな違いは、デフォルトでバリデーションメッセージ用のファイル(lang)がインストールされていないことです。

Laravelはドキュメントを日本語訳して下さっている方々がいるため、何か困ったことがあればそちらを参照すると大体の問題は解決できるかと思います。

【日本語ドキュメント】https://readouble.com/laravel/11.x/ja/

しかし、その方のプログラミング歴によっては、それでもドキュメントを読み解くのは大変なことも多々あるかと思います。(ドキュメントの言い回しはなかなか慣れません……)

今回はそうした方々の一助となればという思いもあり、簡単ではありますが、バリデーションに関する記事を書かせていただきました。

ケケンタ

この記事が少しでもお役に立ったなら何よりです!

それでは、最後までご覧いただきありがとうございました!

Laravelのおすすめ記事

この記事が気に入ったら
フォローしてね!

この記事が良いと思ったらシェアしてね!

コメント

コメントする

CAPTCHA


目次