FormRequestでバリデーションを行う前に値を操作する

こんにちは、コバヤシです。

今回はLaravelのFormRequestでバリデーションを行う前に、値を操作する方法について書きたいと思います。

FormRequestとは

FormRequestはリクエストの処理でバリデーションを行うLaravelの仕組みです。
リクエストの段階でバリデーションが行われる為、バリデーションチェックをクリアできたときのみ Controllerの処理が実行されます。
これにより、バリデーション処理とコントローラーの処理を分離することが可能です。

readouble.com

この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に設定します。

様々な場面で使い分けて使用しましょう。