Laravelでフォームを作成すると、バリデーション機能が非常に便利です。
しかし、デフォルトのままだと、エラーが発生した際に「The name field is required.」のように、英語のメッセージが表示されてしまいます。
ユーザーにとって親切なアプリケーションを作るためには、これらのメッセージを日本語のわかりやすい表現にカスタマイズすることが不可欠です。
「”name”の部分を”お名前”に変えたい」
「特定のフォームだけでメッセージを変えるには?」
この記事では、上記のような疑問を解決していきますので、是非参考にしてください。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 550,000円(給付金適用あり) | |
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 | |
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ | |
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 無料 | |
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
【基本】エラーメッセージをBladeビューに表示する方法
メッセージをカスタマイズする前に、まずはエラーメッセージをビューに表示させる方法を確認しておきましょう。
Laravelでは、バリデーションに失敗すると、自動的にエラーメッセージが$errors
という変数に格納され、ビューに渡されます。
フォームの上部などに全てのエラーをまとめて表示することもできますが、ユーザー体験を考えると、各入力項目の直下に個別のエラーメッセージを表示するのが一般的です。これには@error
ディレクティブを使うのが最も簡単です。
サンプルコード:@errorを使った表示
<form method="POST" action="/profile">
@csrf
<div>
<label for="name">お名前</label>
<input id="name" type="text" name="name" value="{{ old('name') }}">
{{-- 'name'フィールドにエラーがあればメッセージを表示 --}}
@error('name')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
</div>
<div>
<label for="email">メールアドレス</label>
<input id="email" type="email" name="email" value="{{ old('email') }}">
@error('email')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
</div>
<button type="submit">更新</button>
</form>
@error
ディレクティブは、引数に指定したフィールド(この場合はname
)にエラーメッセージが存在する場合のみ、その内部のHTMLを描画します。$message
という変数には、該当するエラーメッセージが自動的に格納されています。
バリデーションメッセージをカスタマイズする3つの主要な方法
Laravelでバリデーションメッセージをカスタマイズするには、主に3つの方法があります。
それぞれに特徴があるため、状況に応じて最適なものを選択しましょう。
方法1:Form Requestでメッセージをカスタマイズする(推奨)
Controllerが太るのを防ぎ、バリデーションロジックを専用のクラスに分離できるForm Requestは、実務において最も推奨される方法です。
まず、artisanコマンドでForm Requestクラスを作成します。
php artisan make:request UserUpdateRequest
app/Http/Requests/UserUpdateRequest.php
というファイルが生成されます。
次に、このファイルを編集して、バリデーションルール、カスタムメッセージ、そして属性名(項目名)の日本語化を設定します。
サンプルコード:UserUpdateRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UserUpdateRequest extends FormRequest
{
/**
* このリクエストの認可設定。
*
* @return bool
*/
public function authorize(): bool
{
// ここでは単純にtrueを返すが、実際にはユーザーの権限チェックなどを行う
return true;
}
/**
* バリデーションルールを定義する。
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|max:255',
'email' => 'required|email|unique:users,email',
];
}
/**
* バリデーションエラーのカスタムメッセージを定義する。
*
* @return array
*/
public function messages(): array
{
return [
'name.required' => 'お名前は必ず入力してください。',
'name.max' => 'お名前は255文字以内で入力してください。',
'email.required' => 'メールアドレスは必ず入力してください。',
'email.email' => '有効なメールアドレス形式で入力してください。',
'email.unique' => 'このメールアドレスは既に使用されています。',
];
}
/**
* バリデーションエラーのカスタム属性名を定義する。
*
* @return array
*/
public function attributes(): array
{
return [
'name' => 'お名前',
'email' => 'メールアドレス',
];
}
}
rules()
メソッド: ここにバリデーションルールを記述します。messages()
メソッド:項目名.ルール名
をキーとして、表示したいメッセージを定義します。これがメッセージのカスタマイズの核心部分です。attributes()
メソッド:項目名
をキーとして、メッセージ内で:attribute
プレースホルダに表示される名前を定義します。これにより、「nameは必須です」が「お名前は必須です」のように変わります。
最後に、Controller側でこのForm Requestをインジェクション(注入)するだけで、バリデーションが自動的に実行されます。
// Controllerの該当メソッド
use App\Http\Requests\UserUpdateRequest;
public function update(UserUpdateRequest $request)
{
// バリデーションは既に通過している
// ここに更新処理などを記述
}
方法2:言語ファイルでメッセージをカスタマイズする
アプリケーション全体で使われるデフォルトのメッセージや属性名を変更したい場合は、言語ファイルを編集するのが効率的です。
Laravelの言語ファイルはresources/lang
ディレクトリにあります。
日本語のファイルがない場合は、ja
ディレクトリを作成し、その中にvalidation.php
を配置します。(php artisan lang:publish
コマンドで全言語ファイルを公開することもできます)
このファイルは巨大な連想配列になっており、主にmessages
, custom
, attributes
の3つのキーを編集します。
messages配列:デフォルトメッセージの日本語化
配列のキーはバリデーションルール名に対応しています。
ここの値を日本語にすることで、アプリケーション全体のデフォルトメッセージが変更されます。
// resources/lang/ja/validation.php
return [
// ...
'required' => ':attributeは必須です。',
'max' => [
'string' => ':attributeは:max文字以内で入力してください。',
],
'email' => ':attributeは有効なメールアドレス形式ではありません。',
// ...
];
attributes配列:属性名の日本語化
attributes()
メソッドと同様に、ここで属性名を定義すると、アプリケーション全体でname
がお名前
に置き換わります。
// resources/lang/ja/validation.php
return [
// ...
'attributes' => [
'name' => 'お名前',
'email' => 'メールアドレス',
'password' => 'パスワード',
],
// ...
];
方法3:Controllerで直接メッセージをカスタマイズする
簡単なフォームや、一度しか使わないようなバリデーションの場合、Controller内で直接メッセージを定義することもできます。
Validator
ファサードか、$request->validate()
メソッドを使います。
validate()メソッドを使う場合
validate()
メソッドの第2引数にカスタムメッセージの配列を渡します。
use Illuminate\Http\Request;
public function store(Request $request)
{
$validated = $request->validate(
// 第1引数:バリデーションルール
[
'name' => 'required|max:10',
],
// 第2引数:カスタムメッセージ
[
'name.required' => 'ユーザー名は必須です。',
'name.max' => 'ユーザー名は10文字以内でお願いします。',
]
);
// ...
}
プレースホルダを理解して使いこなす
Laravelのバリデーションメッセージには、動的な値に置き換わる「プレースホルダ」が用意されています。
これらを活用することで、より柔軟なメッセージを作成できます。
プレースホルダ | 説明 | 例 |
---|---|---|
:attribute |
検証中のフィールド名。attributes() や言語ファイルでカスタマイズ可能。 |
お名前 |
:min |
min ルールで指定された最小値。 |
10 |
:max |
max ルールで指定された最大値。 |
255 |
:size |
size ルールで指定されたサイズ。 |
5 |
:values |
in ルールなどで指定された値のリスト。 |
A, B, C |
これらのプレースホルダは、メッセージ文字列に含めるだけで自動的に実際の値に置き換えられます。
例: 'name.max' => ':attributeは:max文字を超えないでください。'
→ 「お名前は255文字を超えないでください。」
まとめ
今回は、Laravelのバリデーションエラーメッセージを日本語化し、カスタマイズするための様々な方法を解説しました。
なお、PHPやLaravelを体系的に学んだり、スキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。