Laravel 8.* のフォームリクエストでバリデーションチェック済みの値を整形してみる
突然ですが、フォームリクエストでバリデーションチェック済みの値を整形する必要に出くわしました。
バリデーション前にリクエストを整形することはよくありますが、
バリデーション後にリクエストの整形を行うことはあまり出くわさない状況なので、
その時の作業の備忘録としてここを使わせてもらいます。
さて、あまりない状況においてどうやって実装したものかと考えました。
「バリデーション後のリクエストを整形する処理をControllerに書いてControllerを汚すのもいかがなものか」
「フォームリクエストでバリデーション後のデータ整形するメソッドくらいあるだろ」
とか、
Google先生に尋ねてみたところ、どうやら「passedValidation」というメソッドが存在するということを教えてくれので、
「Laravel passedValidation」と再度先生に尋ねてみるも、肝心のLaravel公式ドキュメントが検索上位に引っかからず…
聞き方を工夫して何度か聞いてみた結果、「passedValidation」の存在確認が取れました。
Laravel 5.8にしっかりマージされています↓
https://github.com/laravel/framework/pull/29549
コメントを追っていくと、
「prepareForValidation()のようにafterValidation()っていうバリデーション後の値をフィルターできたりすると便利じゃない?」っところから
初めは「afterValidation」という名前だったみたいですが、わかりづらいから「passedValidation」となったようですね。
Laravel 8.* にもあり「Handle a passed validation attempt」と記述されています↓
ちゃんと公式の情報で裏が取れたので、早速使ってみたのですが使い方は非常に簡単。
フォームリクエストにpassedValidationメソッドを追加し、実行したい処理を書くだけ。
class HogeRequest extends FormRequest { public function passedValidation() { if (str_contains($this->hoge, '-')) { // リクエストを整形するなんらかの処理 $hoge = str_replace('-', '', $this->hoge); // 整形したデータでリクエストを上書き $this->merge([‘hoge’ => $hoge]); } }
実装より情報収集に時間がかかりました。。。