laravelのvalidation前にrequestデータを加工したい
Laravelでvalidation前にデータを加工したい状況が生まれた。
今回アプリケーションは以下のように
フォーム1で入力した内容をフォーム2のhidden field
に持たせて
フォーム2をsubmit
した際に両方のフォームの内容をDBに保存する。
【validation前にデータを加工しないといけないケース】
- フォーム1は普通にvalidation
- フォーム2でエラーになったらform1の内容を復元してvalidationする
- ありがとうございましたページ
フォーム1のvalidationは普通に作成すれば良い
結論:FormRequestの prepareForValidation メソッドを使う。
prepareForValidation を利用することでvalidation前に request の値を変更することができる。
初めは middleware を使って実装していたが、こちらの方が圧倒的にシンプルに書くことができる。
HogePostと記載してある部分とvalidationルール部分を変更すればこのコードはそのまま使えるだろう。
<?php
namespace App\Http\Requests;
use Illuminate\Validation\Rule;
use Illuminate\Foundation\Http\FormRequest;
class HogePost extends FormRequest {
// prepareForValidation は validation 処理の前に実行される
protected function prepareForValidation() {
if ($this->session()->has('errors')) {
//$this->old()で1つ前のform入力値を取得できるので、今回の入力値に過去の入力値をマージ
$this->merge($this->old());
}
}
public function rules() {
return [
'name' => 'required|string',
'age' => 'required|integer',
'sex' => 'required|integer',
];
}
}
公式ドキュメントはこちら
https://laravel.com/api/5.6/Illuminate/Validation/ValidatesWhenResolvedTrait.html