Laravel 5.7 確認画面付き入力フォームの作成

Laravel

Laravelを使って確認画面付きの入力フォームの作成ですが

Laravel 5で確認画面付き問い合わせフォームを作る
を参考にしたのですが、Laravel 5.5から formatErrors が使えなくなったので別の方法はないか模索してみました。

結論からいうと failedValidation を使えば行けているようです。

大まかな流れは、参考にした記事と同じなので、そちらを見て下さい。

修正ポイント

FormRequestに確認用のトレイとを作成します。
違いはここだけです。

<?php
namespace App\Http\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Validation\ValidationException;

trait ConfirmRequestTrait
{
    /**
     * バリデーションのフック
     *
     * @param $validator
     */
    public function validator($factory){

        // 確認画面用フラグのバリデーションを追加
        $rules = array_merge($this->rules(), [
            'confirming' => 'required|accepted',
        ]);

        $validator = $factory->make(
            $this->all(),
            $rules,
            $this->messages(),
            $this->attributes()
        );

        return $validator;
    }

    /**
     * Handle a failed validation attempt.
     *
     * @param  \Illuminate\Contracts\Validation\Validator  $validator
     * @return void
     *
     * @throws \Illuminate\Validation\ValidationException
     */
    protected function failedValidation(Validator $validator)
    {
        // エラーの取得
        $errors = (new ValidationException($validator))->errors();

        // 確認画面用フラグのバリデーションを除外
        unset($errors['confirming']);

        // 入力データを取得
        $input = $this->all();

        // 確認画面用フラグ以外にエラーが無い場合は確認画面を表示
        if(count($errors)==0){
            $input['confirming'] = 'true';
        }

        throw (new ValidationException($validator, redirect($this->getRedirectUrl())
            ->withErrors($errors)->withInput($input), $this->errorBag));
    }

    /**
     * Get the validated data from the request.
     *
     * @return array
     */
    public function validated()
    {
        // バリデーション済のデータを取得するときに、確認画面用フラグを削除する
        $data = $this->validator->validated();
        unset($data['confirming']);
        return $data;
    }
}

説明

validatorファンクション

ここで確認フラグ confirming のルールを追加しています。

failedValidationファンクション

Does formatErrors not working anymore in Laravel 5.5?
I have following code in my Request class that returns custom messages. public function formatErrors(\Illuminate\Contracts\Validation\Validator $validator) { ...

こちらを参考に個別でエラーの対応をするときは failedValition をオーバーライドすればいいみたいです。

やっていることは

  • バリデーションエラーを取得
  • バリデーションエラーから、確認用フラグのエラーを削除
  • 確認用フラグのエラーを除いて、バリデーションエラーが0個の場合は、確認用フラグにtrueをセットする
  • ValidationExceptionをスローするときに、リダイレクト先にエラーと入力を渡して設定する

コメント