Как задать путь перенаправления выхода из системы laravel 5.3?
Нет ли элегантного решения для перенаправления на определенную страницу после выхода из системы в Laravel 5.3?
Вызываемая функция исходит из признака Аутентифицирует пользователей:
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->flush();
$request->session()->regenerate();
return redirect('/');
}
Это функция по умолчанию из ядра laravel. Поэтому мне приходится переопределять всю функцию, я не могу редактировать ядро. Но нет ли более простого решения, потому что кажется излишним вручную выходить из системы, промывать и восстанавливать снова.
11 answers
Вот как я это сделал. В Auth\LoginController у вас есть:
use AuthenticatesUsers;
Измените его на:
use AuthenticatesUsers {
logout as performLogout;
}
Затем определите новый метод logout()
в вашем логинконтроллере:
public function logout(Request $request)
{
$this->performLogout($request);
return redirect()->route('your_route');
}
Конечно, обычный метод logout()
в этой функции имеет только 3 строки (используется для выхода пользователей из системы), поэтому вы можете скопировать их в свой метод, но вы всегда должны следовать принципу DRY (не повторяйтесь) и повторно использовать столько кода, сколько сможете.
Я бы унаследовал LoginController
и переопределил функцию logout
, исходящую из этой черты:
LoginController.php -> оставьте все как есть.
MyLoginController.php:
class MyLoginController extends LoginController {
protected $redirectAfterLogout = '/goodbye';
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->flush();
$request->session()->regenerate();
return redirect($this->redirectAfterLogout);
}
}
Конечно, вы не должны забывать соответствующим образом обновлять свои маршруты аутентификации.
Я использую Laravel-5.2, то, что я использовал, было:
public function logout()
{
Auth::logout();
Session::flush();
return redirect('/');
}
Убедитесь, что вы импортировали:
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
В вашем контроллере.
Метод Auth::routes в laravel 5.3 регистрирует маршрут POST для /выхода из системы вместо маршрута GET. Это не позволяет другим веб-приложениям выводить пользователей из вашего приложения. Для обновления вам следует либо преобразовать ваши запросы на выход, чтобы использовать глагол POST, либо просто зарегистрировать свой собственный маршрут GET для URI /logout, добавив этот маршрут в файл Routes/web.php :-
Route::get('/logout', 'Auth\LoginController@logout');
И он должен работать нормально и перенаправлять вас в каталог '/', как это определено в LoginController.php
Цитируется из:-
Каждое действие выхода из системы запускает событие Events\Logout
. Вы можете создать прослушиватель, который прослушивает это событие, и добавить к нему некоторую логику. Подробнее о слушателях читайте здесь https://laravel.com/docs/5.3/events
Самый простой способ - переопределить признак выхода из системы в LoginController
в App\Http\Controllers\Auth\LoginController
, как это
public function logout(Request $request){
$this->guard()->logout();
$request->session()->flush();
$request->session()->regenerate();
return redirect()->route('you_route_name');
}
Если вы хотите перенаправить, почему бы вам просто не установить обратное перенаправление ('/'); для обратного перенаправления ('ваш маршрут');
Если вы используете готовый контроллер AuthController, добавьте эту переменную в начало, а затем измените строку, чтобы перенаправить ее туда, куда вы хотите.
protected $redirectAfterLogout = '/';
Класс AuthenticatesUsers имеет функцию выхода из системы, которая проверяет наличие этой переменной.
public function logout()
{
Auth::guard($this->getGuard())->logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}
Просто используйте это в routes/web.php
Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});
Чтобы избежать повторения кода выхода из системы и следовать СУХОМУ, вы можете
- Добавьте пользовательский маршрут выхода из системы в Auth/LoginController, вызовите
Auth::logout()
и верните перенаправление на ваш путь или - Добавьте после -промежуточное программное обеспечение (скажем, redirectafterlogout) и добавьте его в маршрут выхода из системы
Вы можете перейти к vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php
в функции logout
изменить return redirect('/');
на адрес вашего маршрута.