Laravel的redirectTo()方法怎么了?

San*_*yal 14 php laravel laravel-5.3

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

protected $redirectTo = '/home';
Run Code Online (Sandbox Code Playgroud)

以下是文档中的声明:

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

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

但它总是重定向到'/home';任何条件.

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

如果存在方法,它将使用它,否则将使用该属性.但即使方法存在,它看起来似乎正在使用属性.

但是覆盖authenticated()sendLoginResponse()功能正常.

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

redirectTo()方法有什么问题?这是这些方法的GitHub源代码.

我正在使用Laravel版本5.3.28.

San*_*yal 11

这是Laravel v5.3.28redirectPath()中src/Illuminate/Foundation/Auth/RedirectsUsers.php中的方法

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

5.3.29及以上版本的后续版本中.这已在提交文件中更改:

添加auth重定向路径生成方法(#16896)

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

因此,这部分文档仅适用于Laravel 5.3.29及更高版本

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

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


v5.3.28的解决方案

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

if (method_exists($this, 'redirectTo')) {
    return $this->redirectTo();
}
Run Code Online (Sandbox Code Playgroud)


Tro*_*yer 7

简单解决方案

覆盖redirectPath()而不是redirectTo().

使用原始字符串返回:

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

或者超越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';
}
Run Code Online (Sandbox Code Playgroud)

为什么redirectTo()不起作用

在干净的Laravel v.5.3.29 +默认Auth上测试覆盖redirectPath()redirectTo()方法App\Http\Controllers\Auth\LoginController.php,它们按预期工作.

redirectTo()方法的例子

文件说:

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

所以函数需要看起来像这样:

protected function redirectTo()
{
    if(condition) {
      return "/your/path";
    } 
    return "/your/secondpath";
}
Run Code Online (Sandbox Code Playgroud)