Что случилось с методом redirectTo () Laravel?

Мы можем переопределить это свойство, чтобы перенаправить пользователей после входа в 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 для этих методов.

Я использую Laravel версии 5.3.28 .

Это метод redirectPath() в src / Illuminate / Foundation / Auth / RedirectsUsers.php в Laravel v5.3.28

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

В более поздних версиях 5.3.29 и выше . Это было изменено в файле с фиксацией:

Добавить метод генерации пути перенаправления аутентификации (# 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, вручную добавьте это в метод redirectPath() в src / Illuminate / Foundation / Auth / RedirectsUsers.php.

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

Простое решение

Переопределите redirectPath() вместо redirectTo() .

Использование raw string return:

 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 () не работает

Протестировав переопределение метода redirectPath() или redirectTo() в App\Http\Controllers\Auth\LoginController.php на чистом Laravel v.5.3.29 + default Auth, они работают должным образом.

Пример метода redirectTo ()

Документация гласит:

Если для пути перенаправления требуется логика пользовательского генерации, вы можете определить метод redirectTo вместо свойства redirectTo.

Поэтому функция должна выглядеть примерно так:

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