LoginSignup
1
1

More than 3 years have passed since last update.

【Laravel】メール送信内容をバリデーションする方法(with フォームリクエスト)。エラーメッセージの変更方法など

Posted at

Laravelのフォームリクエストという便利機能を使ってバリデーションを実装する方法について。

フォームリクエストを使わないコントローラのみのバリデーション方法の続きです。

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

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

目次

  1. フォームリクエストとは?
  2. フォームリクエストの作成
  3. バリデーションルールの作成
  4. authorizeメソッドの編集
  5. コントローラの編集
  6. バリデーション処理の確認
  7. エラーメッセージの変更
  8. (参考)使用コード一覧


フォームリクエストとは?

バリデーションのコードをコントローラの外に記述する方法。Requestsディレクトリの中のファイルに専用のクラスを作成する。

バリデーションはコントローラにデータを渡す前に実行される。

1. フォームリクエストの作成

以下コマンドを使えばファイルが自動生成できる。(自分でクラスを作成することもできる)

$ php artisan make:request フォームリクエスト名



▼実例

$ php artisan make:request MailFormRequest
Request created successfully.

ファイルは、app > Http > Requests 配下に生成される。

image.png

フォームリクエストの中身

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class MailFormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

認証関連のバリデーションを行うauthorizeメソッドと、バリデーションルールを記述するrulesメソッドが用意されている。


2. バリデーションルールの作成

ルールはrulesメソッドの中に記述する。

    public function rules()
    {
        return [
            'name' => 'required|min:3|max:10',
        ];
    }

ルールを複数設置する場合はカンマでつなげていく。

'name' => 'required|min:3|max:10'
渡されたname属性に対し、required(必須)、min:3(3文字以上)、max:10(10文字以下)の3つのルールを適用している。


3. authorizeメソッドの編集

フォームリクエストのauthorizeメソッドは初期状態でfalseになっている。

この状態だと認証をパスしていない場合は403 |
THIS ACTION IS UNAUTHORIZED.
に飛ばされる。

image.png

今回は認証設定をしないため、この値をtrueに変更する。

    public function authorize()
    {
        return true;
    }


4. コントローラの編集

4-1. 冒頭で作成したフォームリクエストのuse宣言をする。

use App\Http\Requests\[フォームリクエスト名];

4-2. sendアクションにバリデーション後のデータを渡す

public function send([フォームリクエスト名] $変数)

DI(依存注入)で、フォームリクエストクラスのインスタンスを変数に入れて渡す。

▼実例

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Mail;                   //Mailファサード使用
use App\Mail\ValidatedMail; //Mailable使用
use App\Http\Requests\MailFormRequest;  //追記(フォームリクエスト)

class ValidatorController extends Controller
{
    public function index() //コンタクトフォームの表示
    {
        return view('contact.validate');
    }

    public function send(MailFormRequest $validatedRequest)  //メールの自動送信設定
    {
        $data = $validatedRequest;

        Mail::to('xxx@gmail.com')
                ->send(new ValidatedMail($data));

        return back()->withInput()
                     ->with('sent', '送信完了しました。');    //送信完了を表示
    }
}

以上で設定が完了。

5. バリデーション処理の確認

image.png

設定通りにバリデーションできた。


エラーメッセージの変更

デフォルトでは英語の定型メッセージが表示されるため、これを好きな文字列に変更する。

フォームリクエストにmessagesメソッドを追加して戻り値で指定する。

    public function messages()
    {
        return [
            'name.required' => '名前を入力して下さい。',
            'name.max' => ':max 文字以下で入力して下さい。',
            'name.min' => ':min 文字以上で入力して下さい。',
        ];
    }

カスタムメッセージの指定方法は2パターン。今回は(2)を使用。

(1)ルール毎にメッセージを指定する場合
・'ルール' => 'カスタムメッセージ'

(2)属性に適用したルール毎にメッセージを指定する場合
・'属性名.ルール' => 'カスタムメッセージ'



▼処理の確認

image.png

以上で完了。


(参考)使用コード一覧

今回のテストで使用したファイルとコードは以下。

  1. 環境変数
  2. ルーティング
  3. コントローラ
  4. Mailableクラス
  5. フォームリクエスト
  6. コンタクトフォーム
  7. メール本文

1. 環境変数

.env
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your address@gmail.com
MAIL_PASSWORD=your app password
MAIL_ENCRYPTION=tls
MAIL_FROM_NAME="mail title"

2. ルーティング

web.php
//Validatorファサード
Route::get('validator', 'ValidatorController@index');
Route::post('validator', 'ValidatorController@send');

3. コントローラ

ValidatorController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Mail;                   //追記
use App\Mail\ValidatedMail; //追記
use App\Http\Requests\MailFormRequest;  //追記(フォームリクエスト)

class ValidatorController extends Controller
{
    //以下追記
    public function index() //コンタクトフォームの表示
    {
        return view('contact.validate');
    }

    public function send(MailFormRequest $validatedRequest)  //メールの自動送信設定
    {
        $data = $validatedRequest;

        Mail::to('xxx@gmail.com')
                ->send(new ValidatedMail($data));

        return back()->withInput()
                     ->with('sent', '送信完了しました。');    //送信完了を表示
    }
}

4. Mailableクラス

ValidatedMail.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ValidatedMail extends Mailable
{
    use Queueable, SerializesModels;
    public $data;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($data)
    {
        $this->data = $data;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        //以下追記
        return $this->view('emails.validated')
                    ->subject('メールの標題')
                    ->with('data', $this->data);
    }
}

5. フォームリクエスト

MailFormRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class MailFormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required|min:3|max:10',
        ];
    }


    public function messages()
    {
        return [
            'name.required' => '名前を入力して下さい。',
            'name.max' => ':max 文字以下で入力して下さい。',
            'name.min' => ':min 文字以上で入力して下さい。',
        ];
    }
}

6. コンタクトフォーム

validate.blade.php
@if ( Session::has('sent'))
<div>
    <p>{{old('name')}}さん{{ session('sent') }}</p>
</div>
@endif

<form action="{{ url('validator') }}" method="POST">
@csrf

 <p>名前<input type="text" name="name" value="{{ old('name') }}" ></p>
  @error('name')
    <p style="color:red;">{{ $message }}</p>
  @enderror

 <input type="submit" value="送信する">
</form>

7. メール本文

validated.blade.php
<p>名前{{ $data['name'] }}さんから連絡がありました</p>


まとめ

これまで、以下3つの方法でバリデーションを試してきた。

  1. Requestファサードのvalidateメソッドでコントローラに直接記述
  2. Validatorファサードでコントローラに直接記述
  3. フォームリクエストを使用



カスタムメッセージを表示したり、バリデーションを使いまわすなど利便性が高いのは、(3)のフォームリクエスト

管理するファイル数を増やしたくない場合は(2)の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