如何设置laravel 5.3注销重定向路径?

问题描述 投票:36回答:14

在Laravel 5.3中注销后,是否没有优雅的解决方案重定向到特定页面?

被调用的函数来自特征AuthenticatesUsers:

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

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

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

    return redirect('/');
}

这是laravel核心的默认函数。所以我必须覆盖我无法编辑核心的整个功能。但是没有一个更简单的解决方案,因为手动注销,刷新和重新生成感觉有点过分。

在一篇文章中解决了问题:https://codeneverlied.com/how-to-set-logout-redirect-path-in-laravel-5-8-and-before/

php laravel laravel-5.3
14个回答
51
投票

这就是我做到的。在Auth \ LoginController中,您有:

use AuthenticatesUsers;

将其更改为:

use AuthenticatesUsers {
    logout as performLogout;
}

然后,在LoginController中定义一个新的logout()方法:

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

当然,常规logout()方法在该特性中只有3行(用于将用户登出系统),因此您可以将它们复制到您的方法中,但您应该始终遵循DRY原则(不要重复自己)并重复使用尽可能多的代码。


1
投票

只需在routes / web.php中使用它

Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});

0
投票

为避免重复注销代码并遵循DRY,您可以

  • 在Auth / LoginController中添加自定义注销路由,调用Auth::logout()并返回重定向到您的路径,或者
  • 添加一个中间件(比如redirectAfterLogout)并将其添加到注销路径

0
投票

接受的答案很好,但您可以通过简单地覆盖loggedOut方法完全绕过触摸任何注销逻辑:

protected function loggedOut(Request $request) {
    return redirect('/where/ever/you/want/to/go');
}

0
投票

在Laravel 5.8中找到以下路径:

应用程序\ HTTP \ \控制器验证\ 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');;
}

-2
投票

你可以去vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php功能logout改变return redirect('/');到你的路线地址。


25
投票

Laravel > 5.7

接受的答案很好,但您可以通过简单地覆盖loggedOut方法完全绕过触摸任何注销逻辑:

// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request) {
    return redirect('/where/ever/you/want/to/go');
}

10
投票

我将继承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路线。


6
投票

我正在使用Laravel-5.2,我使用的是:

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

确保您已导入:

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

在你的控制器中。


3
投票

laravel 5.3中的Auth :: routes方法为/ logout而不是GET路由注册POST路由。这可以防止其他Web应用程序将您的用户从您的应用程序中删除。要进行升级,您应该将您的注销请求转换为使用POST动词,或者只是通过将此路由添加到文件Routes / web.php来为/ logout URI注册您自己的GET路由: -

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

它应该工作正常,并将您重定向到在LoginController.php中定义的'/'目录

引自: -

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


2
投票

每次注销操作都会触发事件Events\Logout。您可以创建一个侦听此事件的侦听器,并向其中添加一些逻辑。在这里查看有关听众的更多信息https://laravel.com/docs/5.3/events


2
投票

最简单的方法是在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
投票

假设某人现在正在查看它,他们使用的laravel的版本是5.7

在LoginController.js中添加此行

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

这假设您正在使用laravel提供的开箱即用验证模块


1
投票

如果您使用现成的AuthController,请将此变量添加到顶部,然后将字符串更改为重定向到您想要的任何位置。

protected $redirectAfterLogout = '/';

AuthenticatesUsers类具有检出此变量的注销功能。

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

    return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}
© www.soinside.com 2019 - 2024. All rights reserved.