Подтвердить что ты не робот

Что случилось с методом 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.

4b9b3361

Ответ 1

Это метод 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() метод в ИПВ/Осветите /Foundation/Auth/RedirectsUsers.php.

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

Ответ 2

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

Переопределите 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() не работает

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

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

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

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

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

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

Ответ 3

redirectTo перенаправляет пользователей, которые завершили вход в систему или регистрацию. Пользователи, которые уже вошли в систему и пытаются зарегистрироваться или войти снова, будут перенаправлены app/Http/Middleware/RedirectIfAuthenticated.php

if (Auth::guard($guard)->check()) {
    return redirect('/home');
}

Ответ 4

Я думаю, что проблема исходит от маршрутов web.php. Проблема исчезла после того, как я установил маршрут по умолчанию '/', чтобы он указывал на страницу входа.

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