LoginSignup
34

More than 5 years have passed since last update.

Laravelでoldとerrorsをコントローラ内で設定する方法

Last updated at Posted at 2018-11-21

設計もせず簡易ツールをいいかげんに作った際にolderrorsをコントローラ内で設定したくなりましたが、方法がわからなかったので調べてみました。

test.png

やりたいこと

図のような状況で②の処理でエラーが出た際にback()を使うと記事を特定できずに最初のページに戻ってしまいエラーもoldも表示できない。
なので②の直前の状態でエラーが出力されたページを出したい。
つまり、②の処理でエラーが出たら記事詳細画面に記事を特定した状態でエラーとoldを補完した状態にコントローラから遷移させたい。

注意

こんなことをしなくても良いようにちゃんと設計しましょう。

コントローラーからoldを設定する方法

$request->session()->all();

で確認するとわかりますが_old_inputoldデータが保持されている。
設定する方法は以下になります。

$request->session()->flash('_old_input', ['key' => 'value']);

コントローラーからerrorsを設定する方法

$request->session()->all();

で確認するとわかりますがerrorsViewErrorBagというオブジェクトで保持されている。
設定する方法は以下になります。

use Illuminate\Support\ViewErrorBag;

$errors = new ViewErrorBag();
$errors->put('default', $validator->errors());
$request->session()->flash('errors', $errors);

ViewErrorBagを自分で作る場合はMessageBagputする。
$validator->errors()->add()を使い$validator->errors()putするか、
new MessageBag()MessageBagを作成しputで内容を追加してputするか。

エラーが発生した際の遷移する方法

$id = $request->id;
$input_list_for_old = $request->all();

$request->replace([
    'id' => $id// 詳細画面で記事が特定できるようにする(詳細画面にidをPOSTしている状態を再現)
]);
$request->session()->flash('_old_input', $input_list_for_old);
$errors = new ViewErrorBag();
$errors->put('default', $validator->errors());
$request->session()->flash('errors', $errors);

return $this->methodName($request);// 詳細画面のコントローラを呼び出す

成功時の処理

成功時にoldは削除する

$request->session()->flash('_old_input');

遷移先メソッドでerrorsを設定する方法

errorsはミドルウェアShareErrorsFromSessionでセットされており、
メソッド呼び出しではミドルウェアの呼び出しは行われなかったので、
遷移後のコントローラのviewにerrorsをセットする処理が必要。

if ($request->session()->get('errors'))
{
    $data['errors'] = $request->session()->get('errors');
    $request->session()->flash('errors', new ViewErrorBag());// errorを使用したら空をセットしておく
}

return view('template', $data);

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
34