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をスローするときに、リダイレクト先にエラーと入力を渡して設定する
コメント