こんにちは、コバヤシです。
今回はLaravelのFormRequestでバリデーションを行う前に、値を操作する方法について書きたいと思います。
FormRequestとは
FormRequestはリクエストの処理でバリデーションを行うLaravelの仕組みです。
リクエストの段階でバリデーションが行われる為、バリデーションチェックをクリアできたときのみ
Controllerの処理が実行されます。
これにより、バリデーション処理とコントローラーの処理を分離することが可能です。
このFormRequestのバリデーションでチェックされる値は、通常はフォームからのGETやPOSTの値なのですが
これらの値を操作した上で、その値でバリデーションを行いたいたい時があります。
その方法がいくつかありますので、書いていきます。
1 prepareForValidationを使う
<?php class HogeRequest extends FormRequest { protected function prepareForValidation() { $this->merge(['hoge' =>'テスト']); } }
FormRequestのクラス内でprepareForValidationを使うとリクエストの値を直接変更できます。
上記の例では、リクエストデータにhogeが追加されます。
2 validationDataを使う
<?php class HogeRequest extends FormRequest { protected function validationData() { $data = $this->all(); $data['hoge'] = 'テスト'; return $data; } }
FormRequestのクラス内でvalidationDataを使うとバリデーションデータを変更できます。
prepareForValidationとは違いリクエストデータは変更されません。
3 Middlewareで変更する
<?php class Hoge { public function handle($request, Closure $next) { $request->merge(['hoge' => 'テスト']); return $next($request); } }
Middlewareでリクエストの値を直接変更します。
上記の例では、リクエストデータにhogeが追加されます。
まとめ
バリデーション前に値を変更する方法を3つ書きました。
使い分けとしては、直接リクエストデータを変更しその後も使いたいのであれば「prepareForValidation」を使用し
バリデーションの時だけ値を変更したい場合は「validationData」を使う形で良いと思います。
Middlewareで変更する方法は、共通した箇所でリクエストデータを直接変更したい場合にrouteに設定します。
様々な場面で使い分けて使用しましょう。