Laravelのメール送信機能の一環で、入力フォームのバリデーションを設定する方法について。
メール送信機能の作成方法は以下を参照。
・【Laravel】Localhostでgmailを使ってメールを送信する方法。Mailableを使わない方法
・【Laravel】Mailableを使ってメールを送信する方法。データや画像を添付する方法や入力データをメール本文に渡す方法
目次
- バリデーションの記述場所
- バリデーションのメソッド
- バリデーションルール一覧
-
コントローラにバリデーションを実装する方法
5. コントローラの編集
6. コンタクトフォーム(ビュー)の編集
7. バリデーションの確認 -
エラーメッセージの変更
9. validation.phpのcustom配列に追記する
10. validation.phpの本文を書き換える
11. 日本語の言語ファイルを作成する - Varidatorファサードを使ったバリデーション
- フォームリクエストでバリデーションする方法
## バリデーションの記述場所 バリデーションの記述場所は2パターンある。 **(1) コントローラ** **(2) フォームリクエスト**
簡単なバリデーションであればコントローラへの記述で十分。
フォームリクエスト(ファイル)を使う場合は、そのクラスをコントローラで読み込む。
**▼フォームリクエストを使うメリット**
- バリデーションの処理のみを書けるため、コントローラがシンプルで可読性が上がる
- エラーメッセージを各フォームリクエスト毎に設定できる。
- 複数のフォームリクエストを作成することでバリデーションのパターンをいくつも持てる。
### バリデーションのメソッド バリデーションのメソッドは、Requestファサードの**validateメソッド**を使うパターンと、**validatorファサード**のメソッドを使うパターンが用意されている。
若干処理の記述方法が違ったり、エラー発生時の挙動の違いがある。
## validateメソッドとValidatorファサードの違い validateメソッドは例外発生時に自動で元のページにリダイレクトする。
一方、Validatorファサードは自動リダイレクト機能が実装されていないので、使いたい場合は自分で記述するか、Validatorファサードのvalidationメソッドを呼び出す。
呼び出し方法
▼validateメソッド
$validatedData = $request->validate([
'属性名' => 'バリデーションルール',
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
**▼Validatorファサード**
$validator = Validator::make($request->all(), [
'属性名' => 'バリデーションルール',
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
### Validatorファサードのリダイレクト実装方法
▼Validatorファサードの中でvalidateメソッドを使う例
Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
])->validate();
#### ▼Validatorファサードでリダイレクト処理を自分で記述する例
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator)
->withInput();
}
## バリデーションルール バリデーションを実際に記述する際は、以下のようにバリデーションルールをパイプ( | )でつないでいく。
'対象の属性' => 'ルール1|ルール2|ルール3|,,,',
ルールは1から順に適用される。
バリデーションで使えるルールは多数用意されている。
![]() |
---|
### 主なバリデーションルール
ルール名 | 内容 |
---|---|
required | 値が必須。ない場合はエラーになる。 |
e-mailのフォーマットのみ許容する | |
image | イメージ画像 (jpg, jpeg, png, bmp, gif, svg, or webp)のみ許容する |
max:value | 指定した数字以下のみ許容。 |
min:value | 指定した数字以上のみ許容。 |
url | urlのみ許容する。 |
bail | 例外が発生した時点でバリデーションチェックを終了する |
accepted | アクティブかどうかを調べる。'yes', 'on', 1, trueのみ許容する。 |
after:date | 指定日以降のみ許容する |
alpha_num | アルファベットと数字のみ許容する |
@fagaiさんのページがわかりやすいです。
## コントローラにバリデーションを実装する方法 編集するのは2つのファイルのみでOK。(既にメール送信ができる状態)
1. コントローラの編集
バリデーションの設定はとても簡単。以下コードをsendアクションに追加するのみ。
$validateData = $request->validate([
'name' => 'required|string|max:10|min:3',
]);
$data = $validateData;
・$request->validate([バリデーションの条件])
validateメソッドを使用。
・'name' => 'required|string|max:10|min:3'
属性名nameに対して、required(必須)、string(文字列)、max:10(10文字以内)、min:3(3文字以上)の条件を割り当て。
・$data = $validateData;
バリデーション後のデータを変数dateに入れる。
例外があった場合はそのエラーメッセージが入る。
**▼コントローラの記述例**
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Mail; //追記
use App\Mail\ValidatedMail; //追記
class ValidateController extends Controller
{
public function index() //コンタクトフォームの表示
{
return view('contact.validate');
}
public function send(Request $request) //メールの自動送信設定
{
//バリデーション
$validateData = $request->validate([
'name' => 'required|string|max:10|min:3',
]);
$data = $validateData;
//メール送信処理
Mail::to('xxx@gmail.com')
->send(new ValidatedMail($data));
return back()->withInput()
->with('sent', '送信完了しました。'); //送信完了を表示
}
}
### 2. コンタクトフォーム(ビュー)の編集 例外が発生したときに、例外の内容をビューに表示できるようにする。
@error('name')
<p style="color:red;">{{ $message }}</p>
@enderror
これを追加するだけで、エラー発生時に内容が表示される。
バリデーションで例外が発生すると元のページにリダイレクトされ、その際に、エラー内容がそのページに渡される。
追記したコードは受け取ったエラー内容を表示する処理となる。
・@error('属性名')
指定した属性でエラーが発生した場合に以下処理が表示される。
エラー内容は自動的に$message
に入る。
@enderror
で処理を閉じる。
**・`
{{ $message }}
`** pタグ赤色で表示するように指定。ここは別になんでもいい。 大切なのは、`$message`にエラーメッセージが格納されているということ。### 3. バリデーションの確認 実際にブラウザでバリデーションが機能しているか確認してみる。
![]() |
---|
↓文字数が2文字以下
![]() |
---|
3文字以上じゃなきゃダメというエラーメッセージが表示される。
▼その他のエラーもちゃんと表示される。
![]() |
---|
![]() |
---|
## エラーメッセージの変更 デフォルトの状態では、エラーメッセージは決められたテキスト(英語)が表示される。
デフォルトのエラーメッセージの置き場所
resources > lang > en > validation.php
▼minの場合
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
'string' => 'The :attribute must be at least :min characters.',
'array' => 'The :attribute must have at least :min items.',
],
入力された型によってメッセージが変わるようになっている。
-
:attribute
に指定した属性名が入る。 -
:min
に指定した文字数が入る。
### エラーメッセージの変更 コントローラにバリデーションを直接記述する場合のエラーメッセージ変更方法は3つある。
- validation.phpのcustom配列に追記する
- validation.phpの本文を書き換える
- 日本語の言語ファイルを作成する
Voridatorファサードやフォームリクエストを使う場合は、ファイルに直接記述できる。
## 1. validation.phpのcustom配列に追記する 最もシンプルな方法。No2と異なり変更箇所がわかりやすい。
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
//以下追記
'name' => [
'min' => ':min 文字以上で入力してください'
],
],
↓ 保存してバリデーションを実行
![]() |
---|
日本語化に成功。
### 2. validation.phpの本文を書き換える 例えば、`min`の`string`を書き換える場合は以下のようになる。
'min' => [
'numeric' => 'The :attribute must be at least :min.',
'file' => 'The :attribute must be at least :min kilobytes.',
// 'string' => 'The :attribute must be at least :min characters.',
'string' => '名前は :min 文字以上で入力してください.',
'array' => 'The :attribute must have at least :min items.',
![]() |
---|
## 3. 日本語の言語ファイルを作成する 日本語の言語ファイルを作成し、設定言語を日本語に切り替える方法。
本格的に日本語化したい場合は使えるが、翻訳作業に時間がかかる、、
3-1. jaディレクトリを作成
enディレクトリ配下をコピーしてjaディレクトリに貼り付け。
3-2. validation.phpのメッセージを書き換える
jaディレクトリのファイルを日本語化する。
大変なので、今回はrequired
のみ日本語化
'required' => 'この項目は必須です。',
3-3. 設定言語をjaに変更する
config > app.php のlocale(言語設定)をenからjaに変更する。
/*
|--------------------------------------------------------------------------
| 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' => 'ja',
以上で設定完了。
**▼検証結果**
![]() |
---|
jaディレクトリの内容が適用できた。
### 日本語翻訳版validation.php Laravel公式ページに[翻訳後のvalidation.php](https://readouble.com/laravel/8.x/ja/validation-php.html )あります。
## Varidatorファサードを使ったバリデーション requestファサードのvalidateメソッドではなく、Varidatorファサードを使った場合の記述方法について。
Validatorファサードを使う場合はコントローラの冒頭に以下を記述する。
use Illuminate\Support\Facades\Validator;
Validatorのmakeメソッドでバリデーションを定義する。**makeメソッドは引数を3つ**とる。
Validator::make(対象データ, バリデーションルール, エラーメッセージ)
- 第1引数:バリデーション対象のデータ
- 第2引数:バリデーションルール
- 第3引数:カスタムエラーメッセージ(なくてもいい)
バリデーションルールやエラーメッセージは変数で渡すことが多い。
ルールには$rules
, エラーメッセージは$messages
を渡すなど。
## 実例 ### 1. コントローラの編集 コントローラのsendアクションに以下を追加する。
use Illuminate\Support\Facades\Validator;
Validatorファサードを使うために冒頭に表示する。
//バリデーションルール
$rules = [
'name' => 'required|min:3|max:10',
];
//Validator
$validator = Validator::make($request->all(), $rules)
->validate();
・$rules
属性に対しバリデーションルールを設定する。
カンマでつないで複数設定できる。
・$request->all()
渡されたすべてのデータをバリデーション対象とする。
・->validate();
validateメソッドで自ページに自動リダイレクトする。
この処理は以下記述と同じ。
if ($validator->fails()) {
return redirect('validate')
->withErrors($validator)
->withInput();
}
バリデーションで例外が発生したら、URI:validateにリダイレクト(ここでは自ページ)
・withErrors()
リダイレクト画面に$errors
でエラーデータを渡す。
・withInput()
フォームの入力内容をリダイレクト画面に渡す。old()
で呼び出せる。
## コントローラの記述例 コントローラの記述は以下のようになる。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Mail; //追記
use App\Mail\ValidatedMail; //追記
use Illuminate\Support\Facades\Validator; //追記
class ValidateController extends Controller
{
public function index() //コンタクトフォームの表示
{
return view('contact.validate');
}
public function send(Request $request) //メールの自動送信設定
{
//バリデーションルール
$rules = [
'name' => 'required|min:3|max:10',
];
//Validator
$validator = Validator::make($request->all(), $rules, $messages)
->validate();
Mail::to('xxx@gmail.com')
->send(new ValidatedMail($validator));
return back()->withInput()
->with('sent', '送信完了しました。'); //送信完了を表示
}
}
### 2. コンタクトフォーム(ビュー)の編集 例外が発生したときに、例外の内容をビューに表示できるようにする。
@error('name')
<p style="color:red;">{{ $message }}</p>
@enderror
これを追加するだけで、エラー発生時に内容が表示される。
バリデーションで例外が発生すると元のページにリダイレクトされ、その際に、エラー内容がそのページに渡される。
追記したコードは受け取ったエラー内容を表示する処理となる。
・@error('属性名')
指定した属性でエラーが発生した場合に以下処理が表示される。
エラー内容は自動的に$message
に入る。
@enderror
で処理を閉じる。
**・`
{{ $message }}
`** pタグ赤色で表示するように指定。ここは別になんでもいい。 大切なのは、`$message`にエラーメッセージが格納されているということ。### 3. バリデーションの確認 実際にブラウザでバリデーションが機能しているか確認してみる。
▼実行結果
![]() |
---|
バリデーション成功。
## エラーメッセージをカスタムする エラーメッセージをカスタムする方法は4つある。
1. validation.phpのcustom配列に追記する
2. validation.phpの本文を書き換える
3. 日本語の言語ファイルを作成する
4. 第3引数でメッセージを渡す
No.1~3はRequestファサードのvalidateメソッドを使った場合も共通。validateメソッドのカスタムメッセージ表示方法
No.4がValidatorファサード特有の便利機能。
## 第3引数でメッセージを渡す方法 ルールの指定方法は2つある。
(1)ルール毎にメッセージを指定する場合
・'ルール' => 'カスタムメッセージ'
(2)属性に適用したルール毎にメッセージを指定する場合
・'属性名.ルール' => 'カスタムメッセージ'
この記述であれば、formの中に同じルールが複数ある場合に、メッセージの出しわけができる。
//バリデーションルール
$rules = [
'name' => 'required|min:3|max:10',
];
//追記
$messages = [
'name.max' => ':max 文字以下で入力して下さい。',
'name.min' => ':min 文字以上で入力して下さい。',
];
//Validator
$validator = Validator::make($request->all(), $rules, $messages) //追記
->validate();
▼実行結果
![]() |
---|
## まとめ Requestファサードのvalidateメソッドを使うよりも、Validatorファサードを使った方が記述がわかりやすい。(個人的見解)
## フォームリクエストでバリデーションする方法
長くなったので別記事に記述します。