それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

laravelでリクエスト内容を書き換える(rule適用前/適用後)

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 で前処理

全角半角改行だとか、ユーザーに投げ返すまでもないことは、ルール中で書き換えると見通しが悪くなる。前処理でまるっと書き換えておくほうが楽だね。