1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Laravel】メール送信用入力フォームのバリデーション(validation)設定方法。コントローラを使ったバリデーションとエラーメッセージの変更

Last updated at Posted at 2021-01-21

Laravelのメール送信機能の一環で、入力フォームのバリデーションを設定する方法について。

メール送信機能の作成方法は以下を参照。
【Laravel】Localhostでgmailを使ってメールを送信する方法。Mailableを使わない方法

【Laravel】Mailableを使ってメールを送信する方法。データや画像を添付する方法や入力データをメール本文に渡す方法

Larael公式 バリデーション

目次

  1. バリデーションの記述場所
  2. バリデーションのメソッド
  3. バリデーションルール一覧
  4. コントローラにバリデーションを実装する方法
    5. コントローラの編集
    6. コンタクトフォーム(ビュー)の編集
    7. バリデーションの確認
  5. エラーメッセージの変更
    9. validation.phpのcustom配列に追記する
    10. validation.phpの本文を書き換える
    11. 日本語の言語ファイルを作成する
  6. Varidatorファサードを使ったバリデーション
  7. フォームリクエストでバリデーションする方法

## バリデーションの記述場所 バリデーションの記述場所は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から順に適用される。

バリデーションで使えるルールは多数用意されている。

image.png

バリデーションルール一覧


### 主なバリデーションルール
ルール名 内容
required 値が必須。ない場合はエラーになる。
email 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に入れる。
例外があった場合はそのエラーメッセージが入る。


**▼コントローラの記述例**
ValidateController.php
<?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. バリデーションの確認 実際にブラウザでバリデーションが機能しているか確認してみる。
image.png

↓文字数が2文字以下

image.png

3文字以上じゃなきゃダメというエラーメッセージが表示される。


▼その他のエラーもちゃんと表示される。
image.png
image.png

## エラーメッセージの変更 デフォルトの状態では、エラーメッセージは決められたテキスト(英語)が表示される。

デフォルトのエラーメッセージの置き場所

resources > lang > en > validation.php

image.png

▼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つある。
  1. validation.phpのcustom配列に追記する
  2. validation.phpの本文を書き換える
  3. 日本語の言語ファイルを作成する

Voridatorファサードやフォームリクエストを使う場合は、ファイルに直接記述できる。


## 1. validation.phpのcustom配列に追記する 最もシンプルな方法。No2と異なり変更箇所がわかりやすい。

image.png
このファイルの下の方にある、custom部分に追記する。

validation.php
    'custom' => [
        'attribute-name' => [
            'rule-name' => 'custom-message',
        ],
        //以下追記
        'name' => [
            'min' => ':min 文字以上で入力してください'
        ],
    ],

 ↓ 保存してバリデーションを実行

image.png

日本語化に成功。


### 2. validation.phpの本文を書き換える 例えば、`min`の`string`を書き換える場合は以下のようになる。
validation.php
    '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.',
image.png

## 3. 日本語の言語ファイルを作成する 日本語の言語ファイルを作成し、設定言語を日本語に切り替える方法。

本格的に日本語化したい場合は使えるが、翻訳作業に時間がかかる、、

3-1. jaディレクトリを作成

enディレクトリ配下をコピーしてjaディレクトリに貼り付け。

image.png

3-2. validation.phpのメッセージを書き換える

jaディレクトリのファイルを日本語化する。
大変なので、今回はrequiredのみ日本語化

validation.php
'required' => 'この項目は必須です。',

3-3. 設定言語をjaに変更する

config > app.php のlocale(言語設定)をenからjaに変更する。

image.png

app.php
    /*
    |--------------------------------------------------------------------------
    | 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',

以上で設定完了。


**▼検証結果**
image.png

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()で呼び出せる。


## コントローラの記述例 コントローラの記述は以下のようになる。
ValidateController.php
<?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. バリデーションの確認 実際にブラウザでバリデーションが機能しているか確認してみる。

▼実行結果

image.png

バリデーション成功。


## エラーメッセージをカスタムする エラーメッセージをカスタムする方法は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();       

▼実行結果

image.png

## まとめ Requestファサードのvalidateメソッドを使うよりも、Validatorファサードを使った方が記述がわかりやすい。(個人的見解)

## フォームリクエストでバリデーションする方法

長くなったので別記事に記述します。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?