LoginSignup
0
0

More than 3 years have passed since last update.

Laravel FormRequestの500エラー

Last updated at Posted at 2020-01-13

正常時
index.blade.php -> Controller@add(add_flag) -> Model@addバリセーフ-> index.blade.php
index.blade.php -> Controller@edit(edit_flag) -> Model@updateバリセーフ -> index.blade.php
バリデーションアウト時
index.blade.php -> Controller@add(add_flag) -> Model@addバリアウト -> index.blade.php
index.blade.php -> Controller@edit(edit_flag) -> Model@updateバリアウト -> 500エラー
改善例
index.blade.php -> Controller@edit(edit_flag) -> Model@updateバリアウト -> Controller@reEdit -> index.blade.php

index.blade.phpとFormRequestを使いまわして、
追加処理画面と編集画面を兼用した場合の話。

FormRequestを設定して@add@editの引数のバリデーションしたら、
@editの方だけが500エラーがでて動かないことがありました。
その対処法の一つです。

FormRequestを分けます。
エラーの出なかった@addはそのまま。
エラーの出た@update用をUpdateRequest等とします。

UpdateRequest
public function rules()
{
//@addのものと同じ
}
//以下追加
protected function failedValidation(Validator $validator)
{
    $this->merge(['validated' => 'true']);
    throw new HttpResponseException(
        //編集 -> バリデーションチェックNG -> リダイレクト
        redirect(route('Controller.reEdit'))->withErrors($validator)->withInput()->with('request', $this->request)
    );
}

なんてことはありません。
エラーを拾ってバイバス用の@reEditメソッドへ飛ばしているだけです汗

web.php
Route::get('/index', 'Controller@index')->name('Controller.index');
//getメソッドとすることで正常動作
Route::get('/reedit', 'Controller@reEdit')->name('Controller.reEdit');
Controller@reEdit
public function reEdit(Request $request) {
    $old_input = $request->session()->get('_old_input');
    //$usersが複数形なのはindex.blade.phpの引数に合わせてます
    //違和感バリバリですみません・・
    $users = new Model;
    //バリデーションアウトなデータを直してもらうために
    $users->id = $old_input['id'];
    $users->name = $old_input['name'];
    $users->tel = $old_input['tel'];
    $is_edit = true;
    return view('Controller.index', compact('is_edit', 'users'));
}

以上です。

追加画面と編集画面を分けていればおそらくこんなことにはならない。
コードの好みの問題かなあ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0