【Laravel】フォームリクエストの使い方とカスタマイズバリデーション

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