2017-02-03 1 views
13

Мы можем переопределить это свойство для перенаправления пользователей после входа в LoginController:Что случилось с методом redirectTo() Laravel?

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 version 5.3.28.

+0

Пробовали ли вы перекрывая 'redirectPath()' вместо 'RedirectTo()' – Troyer

+0

@Troyer Вы имели в виду это внутри '' RedirectTo) метод (? –

+0

@Troyer не '$ this-> redirectTo = '/ volunteer'' или переопределение' redirectPath() 'работает. но это нормально с переопределением 'authenticated()' метода с тем же кодом. –

ответ

9

Это метод redirectPath() в ИПВ/Осветите/Foundation/Auth/RedirectsUsers.php в Laravel v5.3.28

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

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

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:

pro регистрируемый функция RedirectTo() {//}


Раствор для v5.3.28

Чтобы сделать redirectTo() метод работы в v5.3.28 вручную добавить это в redirectPath() метод в ИПВ/Осветите/Фонд/Auth/RedirectsUsers.php.

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

Простое переопределение redirectPath() –

+0

@Leonid да. ты прав. Но вопрос в том, почему метод redirectTo() 'не укусит, как указано в документации? а не какие могут быть другие решения? –

5

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

Override redirectPath() вместо redirectTo().

Использование сырой строки возврата:

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

Или наиважнейшая redirectPath() к Laravel 5.3. 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 + по умолчанию Auth, они работают, как ожидалось.

Exemple из RedirectTo() метод

Документация говорит:

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

Так функция должна выглядеть следующим образом:

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

Override 'redirectPath()' тоже не работает, я его протестировал, и я уверен в этом. –

+0

выглядит как-то неправильно с redirectPath() на самом деле, переопределение 'sendLoginResponse()' также отлично.https: //github.com/laravel/framework/blob/7212b1e9620c36bf806e444f6931cf5f379c68ff/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php# L96 –

+0

Я был неправ. фактически переопределение redirectPath() в порядке. Раньше я использовал 'return redirect ('/ volunteer');' но он возвращает путь напрямую. Так что это должно быть 'return '/ volunteer';' Но, да. переопределение функции «redirectTo()» после v5.3.29. и документация как-то не так, но она по-прежнему велика. вы можете отменить свое редактирование. –