如何设置 laravel 5.3 注销重定向路径?
Posted
技术标签:
【中文标题】如何设置 laravel 5.3 注销重定向路径?【英文标题】:How to set laravel 5.3 logout redirect path? 【发布时间】:2017-01-12 16:04:15 【问题描述】:在 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/
【问题讨论】:
你想做什么改变? return redirect()->route('yourroute'); 我希望我可以在我的 LoginController 中设置一些简单的东西,比如protected $logoutRedirectPath = 'my/path/';
但是注销方法应该是 return property_exists($this, 'logoutRedirectPath') ? $this->logoutRedirectPath : '/';
你应该可以使用这样的东西 - ***.com/questions/29797433/…
@AndyHolmes 我希望这样做,但这在 5.3 中不再适用。查看正在调用的方法。
【参考方案1】:
我刚刚将一个旧网站更新到 Laravel 5.3。这包括按照upgrade guide 中的建议从Laravel Github 添加4 个新的Auth 控制器。
三个新的控制器:RegisterController.php、LoginController.php 和 ResetPaswordController.php 都包含一个代码块
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = '/home';
只需将 /home 更改为所需的重定向位置。至少在 Laravel 5.3 中这对我有用(数据 2021 年 4 月)
【讨论】:
【参考方案2】:在我的情况下,我希望它在注销后将用户重定向到主页'/home'
,但它一直将他重定向到登录页面
原因是默认的HomeController
使用了auth中间件
我不得不从 __construct
方法中删除这一行 $this->middleware('auth');
【讨论】:
【参考方案3】:如果我们查看 Laravel 在 AuthenticatesUsers trait 上的默认注销功能代码(对于 laravel 7,它位于 vendor/laravel/ui/auth-backend/AuthenticatesUsers 下),我们将看到用于重定向的硬编码路径。这意味着我们需要从源代码更改 url,但是通过供应商编辑文件是错误的方式,但是特性为我们提供了一种更好的方式,我们可以覆盖代码所以只需将所有注销功能的代码粘贴到 LoginController 页面并更改redirect('/') 函数的参数到你想要的任何 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');
【讨论】:
【参考方案4】:Illuminate Support 包:覆盖 LoginController.php 中的注销方法
use Illuminate\Support\Facades\Auth;
public function logout()
Auth::logout();
return redirect('/wherever/you/want');
【讨论】:
【参考方案5】:假设有人现在正在查看它,并且他们使用的 laravel 版本是 5.7
在 LoginController.php 中添加这一行
public function logout()
Auth::logout();
return redirect()->to('/your-route');
这假设您使用的是 laravel 提供的开箱即用的身份验证模块
【讨论】:
别忘了添加Auth类,使用Auth; 在 Laravel 6.7 确认【参考方案6】:在 Laravel 5.8 中找到以下路径:
App\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');;
【讨论】:
不要更改供应商文件夹中的文件。当您运行 composer update 时,此更改将消失。这不是一个好的解决方案。 谢谢蒂姆·范乌姆。现在我发布了一个新答案。【参考方案7】:Laravel > 5.7
接受的答案很好,但您可以完全绕过任何注销逻辑,只需覆盖loggedOut
方法:
// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request)
return redirect('/where/ever/you/want/to/go');
【讨论】:
不用担心。只是对源代码进行了一些挖掘 也适用于 5.6 你好,请问我应该在哪个文件中覆盖这个方法? 可能是这里唯一正确的答案!确保Request命名空间包含在Controller中,即:use Illuminate\Http\Request;
@Hatef 这对 laravel 5.7+ 有好处,但问题是 laravel 5.3,其中这个答案是错误的。但在这里提一下还是不错的,因为很多人最终会来到这里。【参考方案8】:
接受的答案很好,但您可以通过简单地覆盖loggedOut方法来完全绕过任何注销逻辑:
protected function loggedOut(Request $request)
return redirect('/where/ever/you/want/to/go');
【讨论】:
【参考方案9】:只需在 routes/web.php 中使用它
Route::get('logout', function ()
Auth::logout();
return redirect('your URL');
);
【讨论】:
【参考方案10】:为避免重复注销代码并遵循 DRY,您可以
在Auth/LoginController中添加自定义注销路由,调用Auth::logout()
并返回重定向到您的路径,或者
添加一个after-middleware(比如redirectAfterLogout)并将其添加到注销路由中
【讨论】:
【参考方案11】:如果您使用的是开箱即用的 AuthController,请将此变量添加到顶部,然后更改字符串以重定向到您想要的任何位置。
protected $redirectAfterLogout = '/';
AuthenticatesUsers 类有一个注销函数来检查这个变量。
public function logout()
Auth::guard($this->getGuard())->logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
【讨论】:
【参考方案12】:laravel 5.3 中的 Auth::routes 方法为 /logout 注册了一个 POST 路由,而不是一个 GET 路由。这可以防止其他 Web 应用程序将您的用户从您的应用程序中注销。要升级,您应该将您的注销请求转换为使用 POST 动词,或者通过将此路由添加到文件 Routes/web.php 来为 /logout URI 注册您自己的 GET 路由:-
Route::get('/logout', 'Auth\LoginController@logout');
它应该可以正常工作并将您重定向到 LoginController.php 中定义的“/”目录
引自:-
https://laravel.com/docs/5.3/upgrade
【讨论】:
谢谢,这很有帮助【参考方案13】:我用的是Laravel-5.2,我用的是:
public function logout()
Auth::logout();
Session::flush();
return redirect('/');
确保您已导入:
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
在您的控制器中。
【讨论】:
我很害怕。我认为它非常丑陋。应该可以使用protected $logoutRedirectPath = 'path';
之类的东西向 LoginController(5.2 中的 AuthController)添加一个属性
感谢您的回答。如果可能的话,我可以知道它的来源(或者如果你记得吗?),为你 +1 我的朋友
@IslamElshobokshy 抱歉,我现在不记得了,因为已经有好几年了 :)【参考方案14】:
我就是这样做的。在 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 原则(不要重复自己) 并尽可能多地重复使用代码。
【讨论】:
嗨@avram,我对use … … as …
中的语法有疑问。它看起来有点像导入/解构。你知道这个语法/模式的名称是什么吗?感谢您的帮助,它适用于我正在进行的项目!
@meduz' 我不太清楚它是怎么调用的,我刚刚在 PHP 文档中找到了它:php.net/manual/en/…
唯一没有提到的是在LoginController中包含use Illuminate\Http\Request;
。【参考方案15】:
你可以去vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php
在函数logout
中将return redirect('/');
更改为您的路由地址。
【讨论】:
这是非常糟糕的做法!如果您运行composer update
,您的更改就消失了。切勿更改供应商文件夹中的文件。【参考方案16】:
最简单的方法是像这样在App\Http\Controllers\Auth\LoginController
中覆盖LoginController
的注销特征
public function logout(Request $request)
$this->guard()->logout();
$request->session()->flush();
$request->session()->regenerate();
return redirect()->route('you_route_name');
【讨论】:
想知道为什么你只有 3 票,最聪明和最聪明的选择。【参考方案17】:我会继承 LoginController
并覆盖来自那里的 trait 的 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 路由。
【讨论】:
已经在使用这个了。但是不需要扩展 LoginController,因为控制器是开放的,可以修改。只需将方法添加到 LoginController。因为该方法位于 LoginController 中使用的特征中。这似乎是解决方案,没有在事件内触发重定向,因此事件不是一个选项 你是对的,在 LoginController 本身中定义logout
覆盖是非常好的,我只是想将没有“内置”的东西保存在我自己的单独文件中。
在 laravel 5.3 中就像一个魅力,但你可以直接编辑 LoginController 并覆盖注销方法 - 无论如何,如果它能够像成功登录后的重定向那样实现会很好
@Kaloyan Doichinov,看来你是 laravel 大师。我需要你帮忙。看这里:***.com/questions/41047583/…【参考方案18】:
每个注销操作都会触发一个事件Events\Logout
。您可以创建一个侦听器来侦听此事件并在其中添加一些逻辑。在此处查看有关听众的更多信息https://laravel.com/docs/5.3/events
【讨论】:
发现事件并触发。但是有些东西使它无法重定向。在事件中我有return redirect()->route('admin::login');
,但它没有被触发。事件至少会更干净一些。同样使用普通的header('Location: /');
也不起作用。以上是关于如何设置 laravel 5.3 注销重定向路径?的主要内容,如果未能解决你的问题,请参考以下文章