コントローラー内で別のメソッドを呼び出す
コントローラー内であるメソッドから別のメソッドを呼び出すとき、呼び出されたメソッドの中でリダイレクト処理を実行しようとしてもできません。
例えば以下のようなケース。
(サンプル用に書きましたが、普通はこんな変な書き方はしないと思います。)
class UserController extends Controller
{
function store($request)
{
$this->storeUser($request);
return redirect()->route('user.index');
}
function storeUser(Request $request)
{
if ($request->has('name')) {
// $request に name が存在する場合はユーザーを作成
$user = new User;
$user->name = $request->name;
$user->save();
} else {
// $request に name が存在しない場合は直前のページへリダイレクトしたい
return back()->withErrors(['msg', 'エラーです'])
->withInput();
};
}
}
上記の例で、$request->name
が存在しない場合はフラッシュメッセージ付きで直前のページへ戻るようなリダイレクト処理を書いています。
しかし、このリダイレクト処理は実行されることはありません。
どうしてリダイレクトできないのか
return back()
などとリダイレクト処理を書くと、その処理が実行された瞬間にリダイレクトされるような感覚がありますが(少なくとも自分の場合はありました笑)、これは単に RedirectResponse オブジェクトが返されているだけなのです。
store メソッドに対して RedirectResponse オブジェクトを返しただけでは、当然ながら何も起きません。
(上記の例ではそもそも storeUser メソッドの戻り値を受け取ってすらいません。)
リダイレクトを実行したいのであれば、store メソッドの呼び出し元に対して RedirectResponse オブジェクトを返すことが必要です。
以上、初心者的な発想で「とりあえず return back()
すればリダイレクトしてくれるやろ」と思ってしまった自分に対する反省を込めて。