設計もせず簡易ツールをいいかげんに作った際にold
とerrors
をコントローラ内で設定したくなりましたが、方法がわからなかったので調べてみました。
やりたいこと
図のような状況で②の処理でエラーが出た際にback()
を使うと記事を特定できずに最初のページに戻ってしまいエラーもold
も表示できない。
なので②の直前の状態でエラーが出力されたページを出したい。
つまり、②の処理でエラーが出たら記事詳細画面に記事を特定した状態でエラーとoldを補完した状態にコントローラから遷移させたい。
注意
こんなことをしなくても良いようにちゃんと設計しましょう。
コントローラーからold
を設定する方法
$request->session()->all();
で確認するとわかりますが_old_input
にold
データが保持されている。
設定する方法は以下になります。
$request->session()->flash('_old_input', ['key' => 'value']);
コントローラーからerrors
を設定する方法
$request->session()->all();
で確認するとわかりますがerrors
にViewErrorBag
というオブジェクトで保持されている。
設定する方法は以下になります。
use Illuminate\Support\ViewErrorBag;
$errors = new ViewErrorBag();
$errors->put('default', $validator->errors());
$request->session()->flash('errors', $errors);
ViewErrorBag
を自分で作る場合はMessageBag
をput
する。
$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);