【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',
]);
おすすめ記事:【まとめ】Laravel-バリデーションルール一覧
バリデーションルール違反のエラー処理
入力された値がルールに違反していた場合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',
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。