Нет ли элегантного решения для перенаправления на определенную страницу после выхода из Laravel 5.3?

Вызываемая функция берется из трейта AuthenticatesUsers :

public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->flush();

    $request->session()->regenerate();

    return redirect('/');
}

Это функция по умолчанию из ядра laravel. Поэтому мне нужно переопределить всю функцию, я не могу редактировать ядро. Но нет более простого решения, потому что вручную выходить из системы, промывать и восстанавливать заново кажется излишним.

Обрабатывала ответы в статье: https: // code neverlied. com / how-to-set-logout-redirect-path-in-laravel-5-8-and-before /

62
Tim van Uum 5 Сен 2016 в 12:51

15 ответов

Лучший ответ

Вот как я это сделал. В Auth \ LoginController у вас есть:

use AuthenticatesUsers;

Измените его на:

use AuthenticatesUsers {
    logout as performLogout;
}

Затем определите новый метод logout() в вашем LoginController:

public function logout(Request $request)
{
    $this->performLogout($request);
    return redirect()->route('your_route');
}

Конечно, обычный метод logout() в этом трейте имеет только 3 строки (используется для выхода пользователей из системы), поэтому вы можете скопировать их в свой метод, но вы всегда должны следовать принципу DRY (не повторяйтесь) и повторно используйте столько кода, сколько сможете.

76
Avram 30 Ноя 2016 в 12:06

Laravel> 5.7

Принятый ответ в порядке, но вы можете полностью обойти любую логику выхода, просто перезаписав метод loggedOut:

// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request) {
    return redirect('/where/ever/you/want/to/go');
}
54
Chris 7 Фев 2019 в 11:48

Я бы унаследовал 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);
    }
}

Конечно, не забудьте соответствующим образом обновить свои маршруты Auth.

15
kalatabe 5 Сен 2016 в 10:16

Я использую Laravel-5.2 , вот что я использовал:

public function logout()
{
    Auth::logout();
    Session::flush();
    return redirect('/');
}

Убедитесь, что вы импортировали:

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;

В вашем контроллере.

10
joan16v 30 Ноя 2016 в 12:28

Метод Auth :: routes в laravel 5.3 регистрирует маршрут POST для / logout вместо маршрута GET. Это предотвращает выход пользователей из вашего приложения другими веб-приложениями. Для обновления вы должны либо преобразовать запросы на выход из системы, чтобы использовать команду POST, либо просто зарегистрировать свой собственный маршрут GET для URI / logout, добавив этот маршрут в файл Routes / web.php: -

Route::get('/logout', 'Auth\LoginController@logout');

И он должен работать нормально и перенаправлять вас в каталог '/', как он определен в LoginController.php

Цит. По: -

https://laravel.com/docs/5.3/upgrade

5
Mohamed Gabr 20 Янв 2017 в 19:58

Каждое действие выхода вызывает событие Events\Logout. Вы можете создать слушателя, который слушает это событие, и добавить туда логику. Подробнее о слушателях см. Здесь, https://laravel.com/docs/5.3/events.

2
Andrej Ludinovskov 5 Сен 2016 в 10:06

Если вы используете готовый AuthController, добавьте эту переменную вверху, а затем измените строку, чтобы перенаправить куда хотите.

protected $redirectAfterLogout = '/';

Класс AuthenticatesUsers имеет функцию выхода из системы, которая проверяет наличие этой переменной.

public function logout()
{
        Auth::guard($this->getGuard())->logout();

    return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}
2
cyclops1101 2 Фев 2017 в 00:33

В Laravel 5.8 найдите путь ниже:

Приложение \ Http \ Controllers \ Auth \ LoginController.php

use Illuminate\Http\Request;*

Напишите эту функцию

public function logout(Request $request){
    $this->guard()->logout();

    $request->session()->invalidate();

    return $this->loggedOut($request) ?: redirect('/Where/You/want/to/redirect');;
}
1
Zaheer Sadique 6 Мар 2019 в 06:36

Самый простой способ - переопределить признак выхода из системы в 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');
}
2
ArtemSky 27 Окт 2016 в 13:54

Если мы рассмотрим коды функции выхода из системы Laravel по умолчанию в трейте AuthenticatesUsers (который находится в vendor / laravel / ui / auth-backend / AuthenticatesUsers для laravel 7), мы увидим жестко закодированный путь для перенаправления. Это означает, что нам нужно изменить URL-адрес из источника, но редактирование файлов через поставщика - неправильный способ, однако черты предоставляют нам лучший способ, которым мы можем переопределить коды.Поэтому просто вставьте все коды функции выхода на страницу LoginController и измените параметр функции перенаправления ('/') на любой URL-адрес, который вы хотите. В настоящее время мои коды выглядят так, как будто просто поместите их в LoginController:

/**
 * Log the user out of the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->invalidate();

    $request->session()->regenerateToken();

    if ($response = $this->loggedOut($request)) {
        return $response;
    }

    return $request->wantsJson()
        ? new Response('', 204)
        : redirect('/login');
}
0
Murad Shukurlu 7 Сен 2020 в 12:14

Вы можете перейти на vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php в функции logout измените return redirect('/'); на свой маршрутный адрес.

-5
z.gomar 24 Ноя 2016 в 09:48

Предполагая, что кто-то просматривает его сейчас несколько дней, а версия laravel, которую они используют, составляет 5,7

Добавьте эту строку в LoginController.php

public function logout()
{
    Auth::logout();
    return redirect()->to('/your-route');
}

Предполагается, что вы используете готовый модуль аутентификации, предоставляемый laravel.

7
SMPLYJR 15 Дек 2019 в 23:30

Пакет поддержки Illuminate: переопределить метод выхода из системы в LoginController.php

 use Illuminate\Support\Facades\Auth;

 public function logout()
     {
         Auth::logout();

     return redirect('/wherever/you/want');
 }
1
Florian 1 Мар 2020 в 12:22

Принятый ответ в порядке, но вы можете полностью обойти любую логику выхода, просто перезаписав метод loggedOut:

protected function loggedOut(Request $request) {
    return redirect('/where/ever/you/want/to/go');
}
1
Omid Ahmadyani 29 Дек 2018 в 09:28

Просто используйте это в routes / web.php

Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});
3
Xander 20 Июл 2017 в 05:42