Laravel8 バリデート前にPOST値を加工する方法

例えば、年(yyyy)、月(mm)、日(dd)でPOSTされる値を日付の有効性のチェックをしたい場合、以下のように

public function rules()
{
    return [
        'yyyy' => [
            'required',
            new DateRule(
                $this->yyyy,
                $this->mm,
                $this->dd,
            )
        ],
    ];
}

DateRuleというカスタムバリデーションを作り、yyyyのチェックに併せて有効性のチェックをしても良いが、エラーメッセージはyyyyのところに表示されることになる。

@error('yyyy')<p class="erroer_text">{{ $message }}</p>@enderror

バリデート前にPOSTされた値を加工して、その加工した値をバリデートする方法。
つまり、yyyyとmmとddを連結した値をyyyymmddとしてPOSTされたようにして、yyyymmddとしてバリデートを行い、view側でのエラー判定は、@error(‘yyyymmdd’)で行う方法。

バリデート前に何か処理をしたい場合は、リクエストクラスにprepareForValidation()を追加してそのメソッド内に処理を記述すればOK。

protected function prepareForValidation()
{
    $this->merge([
        'yyyymmdd' => $this->input('yyyy').
                        $this->input('mm').
                        $this->input('dd'),
    ]);
}

mergeメソッドで変数を追加できる。

Rules()を以下のようにする。

public function rules()
{
    return [
         ・
         ・
         ・
        'yyyymmdd' => [
            new DateRule(
                $this->yyyy,
                $this->mm,
                $this->dd,
            )
        ],
         ・
         ・
         ・
    ];
}

エラーメッセージの表示場所は、表示したいところに以下を記述すればOK

@error('yyyymmdd')<p class="erroer_text">{{ $message }}</p>@enderror

ちなみにバリデート通過後に加工したい場合は、passedValidation()を追加して処理を記述すればOK。

protected function passedValidation()
{
    $this->merge([
        'zip' => $this->input('zip1').
                 $this->input('zip2'),
    ]);
}

リクエストクラスで前処理を行っておけばコントローラ側の処理がスッキリするかもしれない。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です