Laravelのフォームリクエストという便利機能を使ってバリデーションを実装する方法について。
フォームリクエストを使わないコントローラのみのバリデーション方法の続きです。
メール送信機能の作成方法については以下を参照。
・【Laravel】Localhostでgmailを使ってメールを送信する方法。Mailableを使わない方法
・【Laravel】Mailableを使ってメールを送信する方法。データや画像を添付する方法や入力データをメール本文に渡す方法
目次
- フォームリクエストとは?
- フォームリクエストの作成
- バリデーションルールの作成
- authorizeメソッドの編集
- コントローラの編集
- バリデーション処理の確認
- エラーメッセージの変更
- (参考)使用コード一覧
## フォームリクエストとは? バリデーションのコードをコントローラの外に記述する方法。Requestsディレクトリの中のファイルに専用のクラスを作成する。
バリデーションはコントローラにデータを渡す前に実行される。
1. フォームリクエストの作成
以下コマンドを使えばファイルが自動生成できる。(自分でクラスを作成することもできる)
・$ php artisan make:request フォームリクエスト名
**▼実例**
$ php artisan make:request MailFormRequest
Request created successfully.
ファイルは、app > Http > Requests 配下に生成される。
フォームリクエストの中身
<?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.
に飛ばされる。
今回は認証設定をしないため、この値を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. バリデーション処理の確認
![]() |
---|
設定通りにバリデーションできた。
## エラーメッセージの変更 デフォルトでは英語の定型メッセージが表示されるため、これを好きな文字列に変更する。
フォームリクエストにmessages
メソッドを追加して戻り値で指定する。
public function messages()
{
return [
'name.required' => '名前を入力して下さい。',
'name.max' => ':max 文字以下で入力して下さい。',
'name.min' => ':min 文字以上で入力して下さい。',
];
}
カスタムメッセージの指定方法は2パターン。今回は(2)を使用。
(1)ルール毎にメッセージを指定する場合
・'ルール' => 'カスタムメッセージ'
(2)属性に適用したルール毎にメッセージを指定する場合
・'属性名.ルール' => 'カスタムメッセージ'
**▼処理の確認**
![]() |
---|
以上で完了。
## (参考)使用コード一覧 今回のテストで使用したファイルとコードは以下。
- 環境変数
- ルーティング
- コントローラ
- Mailableクラス
- フォームリクエスト
- コンタクトフォーム
- メール本文
1. 環境変数
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. ルーティング
//Validatorファサード
Route::get('validator', 'ValidatorController@index');
Route::post('validator', 'ValidatorController@send');
3. コントローラ
<?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クラス
<?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. フォームリクエスト
<?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. コンタクトフォーム
@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. メール本文
<p>名前:{{ $data['name'] }}さんから連絡がありました。</p>
## まとめ これまで、以下3つの方法でバリデーションを試してきた。
- Requestファサードのvalidateメソッドでコントローラに直接記述
- Validatorファサードでコントローラに直接記述
- フォームリクエストを使用
カスタムメッセージを表示したり、バリデーションを使いまわすなど**利便性が高いのは、(3)のフォームリクエスト**。
管理するファイル数を増やしたくない場合は(2)のValidatorファサードの使用がいいと感じた。