10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Laravel】コントローラー内で別のメソッドを呼び出し、その中で return redirect() してもリダイレクトできない

Last updated at Posted at 2018-12-29

コントローラー内で別のメソッドを呼び出す

コントローラー内であるメソッドから別のメソッドを呼び出すとき、呼び出されたメソッドの中でリダイレクト処理を実行しようとしてもできません。

例えば以下のようなケース。
(サンプル用に書きましたが、普通はこんな変な書き方はしないと思います。)

SampleController.php
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() すればリダイレクトしてくれるやろ」と思ってしまった自分に対する反省を込めて。

10
10
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
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?