【Laravel】Validateメソッドの使い方!エラーメッセージの日本語化

この記事からわかること

  • Laravelバリデーションとは?
  • フォーム要素の入力値をチェックする方法
  • コントローラで使えるvalidateメソッドの使い方
  • エラー配列の操作方法メッセージ変更方法
  • エラーメッセージのカスタマイズ日本語化

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Web制作には欠かせない「バリデーション」機能がLaravelでは簡単に実装できるようになっていました。

実際にLaravelでバリデーションを行う方法や使い方、エラー処理からのエラーメッセージの出し方をまとめていきたいと思います。

参照記事:公式リファレンス-バリデーション-

バリデーションとは?

そもそもバリデーション(Validation)とは「検証」と言う意味の英単語でプログラミングでは入力値が正しいものであるかチェックすることを指します。

ユーザーが入力フォームから送信した値をデータベースへの格納やロジックのトリガーにする場合に値をそのまま使ってしまうと望まない値を送信された時にエラーや予期せぬ挙動を引き起こす原因になってしまいます。

そこでユーザーからの入力値がルールを元に正しい形式や値の範囲内に収まっているのかなどを検証し外れていればエラーを発生させユーザーに再入力を促すのがバリデーションの目的となります。

ポイント

Laravelのvalidateメソッド

Laravelでは入力値のバリデーションをvalidateメソッドを使って簡単に実装することができます。

バリデーション処理を記述するのはコントローラ部分です。bladeテンプレートにフォームを設置しルーティング設定をしたらコントローラのアクションメソッドに処理を記述していきます。

index.blade.php(フォーム部分)

<form method="POST" action="{{ route('/validate') }}">
    @csrf

    <label>名前</label>
    <input
        name="name"
        value="{{ old('name') }}"
        type="text">
    @if ($errors->has('name'))
        <p>{{ $errors->first('name') }}</p>
    @endif

    <label>メールアドレス</label>
    <input
        name="email"
        value="{{ old('email') }}"
        type="text">
    @if ($errors->has('email'))
        <p>{{ $errors->first('email') }}</p>
    @endif

    <button type="submit">入力内容確認</button>
</form>

web.php(ルーティング)

Route::post('/validate', 'App\Http\Controllers\validateController@validate');

validateController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;

class validateController extends Controller{

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

    $inputs = $request->all();
    return view('confirm', ['inputs' => $inputs]);
  }

}

validateメソッドはリクエストオブジェクトに定義されており、コントローラファイル内で$request->validate()の形式で呼び出し使用できます。

requestオブジェクトはHTTPリクエスト情報(POSTされた入力値やURL、リクエストヘッダ情報など)を保持しているオブジェクトで使用するにはuse文で読み込みが必要になります。

use Illuminate\Http\Request;

引数にはinput要素で指定しているname属性とその項目に検証させたいルールを連想配列形式で渡します。

$request->validate([
  'name' => 'required|string|size:4',
  'email' => 'required|email',
]);

バリデーションルール違反のエラー処理

入力された値がルールに違反していた場合validateメソッドはIlluminate\Validation\ValidationExceptionに属するエラーレスポンスを返し直前のURL(入力フォーム)へ自動でリダイレクトしてくれます。

その際にエラー内容は$errors配列の中にまとめて格納され、どこからでも入力値やエラーメッセージにアクセスできるようになります。例えばエラーメッセージを表示させる場合は以下の通りです。

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

$errors変数で使えるメソッドの種類と使い方

$errorsには様々なメソッドが用意されています。

hasメソッド

$errors->has('name属性')

hasメソッドは指定したname属性のエラーが存在していればtrueを返すメソッドです。@ifと組み合わせることで存在している場合のみメッセージを取得して表示させることができます。

firstメソッド

$errors->first('name属性')

firstメソッドは指定したname属性のエラーメッセージを取得するメソッドです。

エラーメッセージは設定したバリデーションルールの数だけ格納されますのでfirstメソッドを使った場合1番目のメッセージしか取得できません

getメソッド

項目に格納されている複数のエラーメッセージを取得したい場合はgetメソッドを使用します。getメソッドの場合は返り値が配列になりその中にメッセージが保存されるので@foreachを使って中身を取得します。

@if($errors->has('name'))
  @foreach( $errors->get('name') as $msg)
  <p>{{$msg}}</p>
  @endforeach
@endif

allメソッド

各項目の全てのエラーメッセージを取得したい場合はallメソッドを使用します。allメソッドの場合も返り値が配列になりその中にメッセージが保存されるので@foreachを使って中身を取得します。hasメソッドを使えないので配列の個数をカウントして表示を切り替えます。

@if(count($errors) > 0)
  @foreach( $errors->all() as $msg)
  <p>{{$msg}}</p>
  @endforeach
@endif

@errorディレクティブ

エラーメッセージを表示させるのにhasメソッドで有無を識別していましたがblade構文でも識別可能な@errorディレクティブが用意されています。

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

使い方はhasメソッドと同じで引数に指定したname属性のエラーが存在する場合のみ中に記述した処理を実行してくれます。

また@errorディレクティブを使用する場合はfirstメソッドなどの取得するメソッドを使用しなくても自動で変数$message(固定)に格納してくれます。

バリデーションエラーメッセージの変更方法

バリデーションのエラーメッセージはデフォルトでは英語になっています。

The name field is required.
The email must be a valid email address.

このメッセージは「resources」>「lang」>「en」>「validation.php」で定義されているのでここを変更すればカスタマイズすることができます。

validation.php

<?php

return [

    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    'email' => 'The :attribute must be a valid email address.',
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    'required' => 'The :attribute field is required.',
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
    'size' => [
        'numeric' => 'The :attribute must be :size.',
        'file' => 'The :attribute must be :size kilobytes.',
        'string' => 'The :attribute must be :size characters.',
        'array' => 'The :attribute must contain :size items.',
    ],
    〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

];

ここに全てのルールに対するエラーメッセージが以下の形式で定義されているので自由にカスタマイズすれば表示させるメッセージを変更できます。

'ルール' => 'エラーメッセージ',

メッセージに出てくる:attribute部分が項目名(name属性)に自動で置き換わっている部分です

バリデーションエラーメッセージの日本語化

少数であれば手動で変更する方が早いですが全て日本語化させたい場合はLaravelのロケール(locale)自体を「ja(日本)」に変更することでエラーメッセージも一括で日本語化することができます。

日本語化といっても行うのは「resources」>「lang」内に「ja」ファイルをインストールし設定を変更するだけです。

詳細は以下の記事にまとめてありますのでここでは流れとコマンドだけまとめておきます。

以下のコマンドをターミナル(コマンドライン)で順番に実行すれば「ja」ファイルのインストールが完了します。

日本語化するコマンド

$ cd プロジェクト名
$ php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
$ php -f install-ja-lang.php
$ php -r "unlink('install-ja-lang.php');"

インストールされていることが確認できたらLaravelプロジェクトのローケル設定をしている「config」>「app.php」内を以下のように変更して終了です。

app.php

 /*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/

// 'timezone' => 'UTC', // デフォルト値を削除
'timezone' => 'Asia/Tokyo', 

/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/

// 'locale' => 'en', // デフォルト値を削除
'locale' => 'ja', 

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index