laravel でリクエスト内容を書き換える。
リクエストの内容を書き換えるのなら、フィルタやサービスでDIを思い浮かべるかもしれないが、もっと手軽にできる方法がある。
それは、FormRequest を使うことだった。ブラウザからのリクエストを集合体にできるFormRequestを使えば、ルールもバリデーションも簡単に記述でき、管理はとてもわかり易い。
そして、FormRequestは、ValidationによるRule適用前に、任意のフィルタで、リクエストを書き換えることができる。
prepareForValidation ()
このメソッドを定義しておけば、自動的に読んでくれる。
実際にやってみた例。
次の例は、バリデーション前にCRLF をLFに書き換える例だ。
<?php class ShellBodyEntryRequest extends FormRequest { protected function prepareForValidation () { $this->preventCRLF( 'shell', 'body' ); } protected function preventCRLF ( ...$keys ) { $param = $this->input(); $key_with_dot = join( '.', $keys ); $val = $this->input( $key_with_dot ); $val = preg_replace( "|\r\n|", "\n", $val, -1 ); // Arr::undot Arr::set( $param, $key_with_dot, $val ); $this->merge( $param ); }
prepareForValidation / passedValidation / validationData
- prepareForValidation / 前
- validationData / 中 ( バリデーション中のみ)
- passedValidation / 後
prepareForValidation / passedValidation は リクエストの内容を書き換えできる
validationDataは、Rule適用中のみデータを書き換える。validationData でルールと微妙に合わないときのギャップフィットで、バリデーションを強引に通しスキップすることができる。
prepareForValidation で前処理
全角半角改行だとか、ユーザーに投げ返すまでもないことは、ルール中で書き換えると見通しが悪くなる。前処理でまるっと書き換えておくほうが楽だね。