【Laravel】フォームリクエストの使い方とカスタマイズバリデーション
この記事からわかること
- Laravelのフォームリクエストとは?
- 作成方法と使い方、メリット
- バリデーションのカスタマイズ方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Laravelではバリデーションが簡単に行えるようにたくさんの機能を持っています。リクエストオブジェクトのvalidate
メソッドは代表的な例ですが、今回はよりカスタマイズ性が高いフォームリクエストでのバリデーション方法をまとめていきたいと思います。
公式リファレンス:フォームリクエスト
フォームリクエストとは?
「FormRequest(フォームリクエスト)」とはLaravelに常設されている機能の1つでフォームから送信されたリクエストを操作、拡張するためのリクエストインスタンスを継承したクラスです。
リクエストインスタンスとはフォーム送信された値やユーザー情報、ヘッダ情報などのリクエスト情報を保持しているクラスです。
フォームリクエストではフォーム利用に欠かせないバリデーション(値の検証)機能も簡単に実装することができます。
バリデーション機能はコントローラ側からリクエストインスタンスに紐づけられたvalidate
メソッドを使うことでも実装可能ですが、リクエストデータの処理をコントローラで処理しなければならなくなります。
フォームリクエストを使用するとリクエスト作成時にバリデーション処理を挟むことができコントローラでの記述を無くし、よりすっきりとした構造のプログラムにすることができます。
フォーム(ユーザ)
↓
リクエスト作成(フォーム送信) ⇦バリデーション(フォームリクエスト)
↓
コントローラ ⇦バリデーション(validateメソッド)
↓
レスポンス作成
↓
レンダリング(ページ表示)
FormRequest(フォームリクエスト)のポイント
- フォームから送信されたリクエストを操作、拡張するためのクラス
- バリデーション(値の検証)機能も簡単に実装
- リクエスト作成時にバリデーション処理を挟む
- コントローラ側からロジックを切り離せる
フォームリクエストの作成方法と使い方
FormRequest(フォームリクエスト)の作成〜使用までの流れ
- フォームリクエストを作成する
- 認証やルールを定義
- コントローラ側で読み込む
フォームリクエストはartisan
コマンドを使ってコマンドライン(ターミナル)から作成します。
$ php artisan make:request TestPostRequest
実行すると「app」>「Http」>「Requests」ディレクトリが作成されその中に「TestPostRequest.php」が作成されます。
TestPostRequest.php
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class TestPostRequest 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 [
//
];
}
}
定義されている2つのメソッド
- authorize:アクセスに対してフォームリクエストの利用の是非を定義(真偽値)
- rules:バリデーションルール(連想配列)
authorize
メソッドは一度飛ばして先にrules
メソッドとフォームリクエストの使い方と組み込み方法をまとめていきます。
バリデーションルールを定義する
バリデーションのルールはrules
メソッドの中にinput
要素のname
属性をキー値として、ルールを値にした連想配列形式で記述します。
public function rules()
{
return [
'name' => 'required|string|size:4',
'email' => 'required|email',
'name属性' => 'ルール1|ルール2',
];
}
細かいルールの使い方や種類はこちらの記事にまとめていますので参考にしてください。
おすすめ記事:【まとめ】Laravel-バリデーションルール一覧
フォームリクエストを使用可能にする
このままではまだフォームリクエストは使用できません。フォームリクエストはリクエストインスタンスを継承したクラスなのでコントローラ側からリクエストインスタンスを読み込むようにフォームリクエストも使用していきます。
// 通常のリクエストインスタンスの読み込み
use Illuminate\Http\Request;
// さらにフォームリクエストの読み込み
use App\Http\Requests\TestPostRequest;
続いてコントローラ側のアクションメソッドの引数にリクエストインスタンスの代わりにフォームリクエストを渡します。
public function index(TestPostRequest $request)
{
return view('index');
}
アクションメソッド内での特別な処理は必要なく、引数に渡すだけでフォームの入力値がバリデーションされた状態でレスポンスを返すことができます。バリデーションエラーが発生した場合は自動で直前のURLにリダイレクトしてくれます。
コントローラ側からバリデーション値を操作する
バリデーション済みのデータを全て取得する
// バリデーション済みデータの取得
$input = $request->validated();
バリデーション済みの指定項目のみ取得する
$input= $request->safe()->only(['name', 'email']);
バリデーション済みの指定項目意外取得する
$input = $request->safe()->except(['name', 'email']);
authorizeメソッドを使った認証
authorize
メソッドではアクセスに対してフォームリクエストの使用を許可する(true
)か拒否する(false
)かをreturn
する真偽値によって分岐させることができます。
例えばAuth
を使った認証機能を使っていた場合、ログイン済みであればフォーム利用を可能にすると言ったことも可能です。
// Authの読み込み
use Illuminate\Support\Facades\Auth;
public function authorize()
{
if (Auth::check()) {
return true;
} else {
return false;
}
}
おすすめ記事:Laravel/uiでVueとAuthの導入
authorizeメソッドでは最終的に返す真偽値によってフォームの使用を分岐できるのでカスタマイズの幅がグッと広がります。
エラーメッセージのカスタマイズ
フォームリクエストを定義するとエラー発生時のメッセージもカスタマイズも容易にできるようになります。
変更するにはフォームリクエストを定義しているファイルでmessages
メソッドを呼び出し上書き(オーバーライド)すればOKです。オーバーライドの意味ついては下記記事を参考にしてください。
TestPostRequest.php
public function messages()
{
return [
'name.required' => '名前は必須項目です',
'email.email' => 'メールアドレスの形式で入力してください',
'name属性.ルール名' => '変更後のメッセージ',
];
}
その中の連想配列で、キー値に項目名.ルール名
を値側に変更したい実際のメッセージを記述します。
フォームリクエストを定義していない場合はエラーメッセージは「resources」>「lang」>「en」>「validation.php」の中のルールの記述を変更すればOKです。
validation.php
<?php
return [
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'email' => 'The :attribute must be a valid email address.',
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'required' => 'The :attribute field is required.',
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
];
おすすめ記事:バリデーションのエラーメッセージを日本語化する方法
メッセージ内の:attributeの変更方法
デフォルトのエラーメッセージ(「validation.php」)にはname属性
の値が自動で組み込まれる:attribute
というプレースホルダーが用意されています。
:attribute
を変更したい場合もフォームリクエストを定義しているファイルで今度はattributes
メソッドを呼び出し上書き(オーバーライド)すればOKです。
TestPostRequest.php
public function attributes()
{
return [
'name' => 'お名前',
'email' => 'E-Mail Address',
'name属性' => '変更項目名',
];
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。