Laravel的redirectTo()方法怎么了?

时间:2017-02-03 12:35:37

标签: php laravel laravel-5.3

我们可以在登录LoginController后覆盖此属性以重定向用户:

protected $redirectTo = '/home';

以下是文档中的陈述:

  

如果重定向路径需要自定义生成逻辑,您可以定义一个   redirectTo方法而不是redirectTo属性:

     

受保护的函数redirectTo(){
      //}

但无论条件如何,它总是会重定向到'/home';

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

如果存在某个方法,它将使用它,否则将使用该属性。但即使该方法存在,它看起来仍在使用属性。

但是,覆盖authenticated()sendLoginResponse()功能可以正常工作。

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

redirectTo()方法有什么问题?以下是这些方法的GitHub source code

我使用 Laravel版本5.3.28

4 个答案:

答案 0 :(得分:11)

这是 Laravel v5.3.28

中src / Illuminate / Foundation / Auth / RedirectsUsers.php中的redirectPath()方法
public function redirectPath()
{
    return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

在更高版本 5.3.29及更高版本中。使用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';
 }

所以这部分文档仅适用于Laravel版本5.3.29及更高版本

  

如果重定向路径需要自定义生成逻辑,您可以定义一个   redirectTo方法而不是redirectTo属性:

     

受保护的函数redirectTo(){//}

v5.3.28的解决方案

要使redirectTo()方法在v5.3.28中有效,请在src / Illuminate / Foundation / Auth / RedirectsUsers.php中的redirectPath()方法中手动添加。

if (method_exists($this, 'redirectTo')) {
    return $this->redirectTo();
}

答案 1 :(得分:7)

简单解决方案

覆盖redirectPath()而不是redirectTo()

使用原始字符串返回:

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

或覆盖redirectPath()到Laravel 5.3。 29 redirectPath()版本,然后您的redirectTo()方法将有效。

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

为什么redirectTo()无法正常工作

在干净的Laravel v.5.3.29 +默认身份验证中,经过测试覆盖了redirectPath()中的redirectTo()App\Http\Controllers\Auth\LoginController.php方法,它们按预期工作。

redirectTo()方法的示例

文档说:

  

如果重定向路径需要自定义生成逻辑,则可以定义redirectTo方法而不是redirectTo属性。

因此,该函数看起来应该是这样的:

protected function redirectTo()
{
    if(condition) {
      return "/your/path";
    } 
    return "/your/secondpath";
}

答案 2 :(得分:1)

redirectTo重定向完成登录或注册的用户。 app/Http/Middleware/RedirectIfAuthenticated.php

将重定向已经登录并尝试注册或再次登录的用户。
if (Auth::guard($guard)->check()) {
    return redirect('/home');
}

答案 3 :(得分:0)

我认为问题出在web.php路由。将默认的“ /”路由设置为指向登录页面后,问题消失了。

Route::get('/', function () {
    return redirect(route('login'));
});