What happened to Laravel's redirectTo() method?

后端 未结 4 854
悲哀的现实
悲哀的现实 2021-02-07 12:21

We can override this property to redirect users after login in LoginController:

protected $redirectTo = \'/home\';

And here is the statement fr

相关标签:
4条回答
  • 2021-02-07 12:45

    redirectTo redirects users that complete login or registration. Users who are already logged in and try to register or log in again will be redirected by app/Http/Middleware/RedirectIfAuthenticated.php

    if (Auth::guard($guard)->check()) {
        return redirect('/home');
    }
    
    0 讨论(0)
  • 2021-02-07 12:48

    This is the redirectPath() method in src/Illuminate/Foundation/Auth/RedirectsUsers.php in Laravel v5.3.28

    public function redirectPath()
    {
        return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
    }
    

    In the later versions 5.3.29 and above. This was changed in file with commit:

    Add auth redirect path generation method (#16896)

     public function redirectPath()
     {
         if (method_exists($this, 'redirectTo')) {
             return $this->redirectTo();
         }
         return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
     }
    

    So this part of documentation applies for Laravel version 5.3.29 and later only

    If the redirect path needs custom generation logic you may define a redirectTo method instead of a redirectTo property:

    protected function redirectTo() { // }


    Solution for v5.3.28

    To make redirectTo() method work in v5.3.28, manually add this in redirectPath() method in src/Illuminate/Foundation/Auth/RedirectsUsers.php.

    if (method_exists($this, 'redirectTo')) {
        return $this->redirectTo();
    }
    
    0 讨论(0)
  • 2021-02-07 12:51

    Simple solution

    Override redirectPath() instead of redirectTo().

    Using raw string return:

    protected function redirectPath()
    {
      if (Auth::user()->role==0) {
        return '/volunteer';
      } else {
        return '/donor';
      }
    }
    

    Or overriding redirectPath() to the Laravel 5.3.29 redirectPath() version and then your redirectTo() method will work.

    public function redirectPath()
    {
      if (method_exists($this, 'redirectTo')) {
       return $this->redirectTo();
      }     
      return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
    }
    

    Why redirectTo() is not working

    Tested overriding the redirectPath() or redirectTo() method in App\Http\Controllers\Auth\LoginController.php on a clean Laravel v.5.3.29 + default Auth, they work as expected.

    Example of redirectTo() method

    Documentation says:

    If the redirect path needs custom generation logic you may define a redirectTo method instead of a redirectTo property.

    So, the function should look something like this:

    protected function redirectTo()
    {
        if(condition) {
          return "/your/path";
        } 
        return "/your/secondpath";
    }
    
    0 讨论(0)
  • 2021-02-07 13:07

    I think the issue comes from the web.php routes. I problem went away after I set the default '/' route to point to the login page.

    Route::get('/', function () {
        return redirect(route('login'));
    });
    
    0 讨论(0)
提交回复
热议问题