【Laravel】フォームリクエストを使ったバリデーション方法
「フォームリクエスト」とは、バリデーション処理を外部クラスにまとめることができる機能です。
任意のリクエストで呼び出すことが可能で、外部ファイル化することでコントローラー内のコードもスッキリさせることができます。
フォームリクエストの作成
artisanコマンドを使い作成します。(コマンドの方が楽です)
前回の続きで BoardController
の拡張用ファイルなので「BoardRequest」とします。
1 2 3 4 |
$ php artisan make:request BoardRequest -- 成功したら以下のメッセージが出る Request created successfully. |
上記のコマンド発行で「app\Http\Requests\」配下に「BoardRequest.php」が作成されます。
作成された直後の内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class BoardRequest 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 [ // ]; } } |
フォームリクエストは「FormRequest」クラスを親として継承して作成されており、デフォルトで2つのメソッドが用意されています。
authorizeメソッド
このフォームリクエストを利用が許可されているかを示すアクション。trueを返せば許可され、falseが帰った場合は403ステータスのレスポンスが返されます。
特になにも判定がない場合は常にtrueを返します。
rulesメソッド
バリデーションの検証ルールを設定するアクション。コントローラー内に書いた検証ルールを書けば良いとのこと。
フォームリクエスト修正
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class BoardRequest 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 [ 'subject' => 'required|max:10', 'email' => 'email', 'message' => 'required|max:50', ]; } } |
authorizeメソッドは true を返すように変更。
rulesメソッドはコントローラー内に書いていた検証ルールをそのままコピペ。
BoardControllerを編集
次に前回作成したコントローラーを編集。
(1)フォームリクエストを使用する旨をコントローラーに記述
(2)addメソッド内に書いていた検証ルールを削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
use App\Http\Requests\BoardRequest; // ←★(1)追加 class BoardController extends Controller { public function index(Request $request) { // 略 } public function add(BoardRequest $request) // (1)Request → BoardRequestに変更 { $data = [ 'msg' => '正しく入力されました!', ]; // (2)このあたりにあったバリデーション設定を削除 return view('board.index', $data); } } |
送信結果
フォームに何も記入せずに「送信」ボタンを押したところです。
前回と同じく英語のメッセージが表示されました。どうやら動作は問題なくできているようです。
メッセージのカスタマイズ(オーバーライド)
動作の確認ができたので、次にエラーメッセージを日本語化してみたいと思います。
BoardRequestクラスへ「messages」メソッドを追加し、継承元で設定されているメソッドをオーバーライドする形をとります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/** * エラーメッセージを日本語化 * */ public function messages() { return [ 'subject.required' => '件名を入力してください', 'subject.max' => '件名は10文字以内で入力してください', 'email.email' => 'メールアドレスとして正しい形式ではありません', 'message.required' => 'メッセージを入力してください', 'message.max' => 'メッセージは50文字以内で入力してください', ]; } |
の形でメッセージ情報を作成。
メッセージ情報はそれぞれのフィールドに用意した1つ1つのルールごとに用意します。
1項目に複数のルールが設定されている場合はそれぞれのメッセージを用意する必要があり、ルールに対して記述していないメッセージがある場合は英語のデフォルトメッセージが表示されます。