如何设置 laravel 5.3 注销重定向路径?
How to set laravel 5.3 logout redirect path?
有没有优雅的解决方法可以在退出后重定向到特定页面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/
我用的是Laravel-5.2,我用的是:
public function logout()
{
Auth::logout();
Session::flush();
return redirect('/');
}
确保您已导入:
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
在你的控制器中。
每个注销操作都会触发一个事件 Events\Logout
。您可以创建一个侦听此事件的侦听器并向其中添加一些逻辑。在此处查看有关听众的更多信息 https://laravel.com/docs/5.3/events
我会继承 LoginController
并覆盖来自其中特征的 logout
函数:
LoginController.php -> 保持原样。
我的LoginController.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 路由。
最简单的方法是像这样在 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');
}
你可以去 vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php
在函数 logout
中将 return redirect('/');
更改为您的路由地址。
我就是这样做的。在 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 原则(不要'重复你自己)并尽可能多地重复使用代码。
laravel 5.3 中的 Auth::routes 方法为 /logout 注册了一个 POST 路由,而不是 GET 路由。这可以防止其他 Web 应用程序将您的用户从您的应用程序中注销。要升级,您应该将注销请求转换为使用 POST 动词,或者通过将此路由添加到文件 Routes/web.php 来为 /logout URI 注册您自己的 GET 路由: -
Route::get('/logout', 'Auth\LoginController@logout');
它应该可以正常工作并将您重定向到 LoginController.php
中定义的“/”目录
引用自:-
如果您使用开箱即用的 AuthController,请将此变量添加到顶部,然后更改字符串以重定向到您想要的任何位置。
protected $redirectAfterLogout = '/';
AuthenticatesUsers class 具有检查此变量的注销功能。
public function logout()
{
Auth::guard($this->getGuard())->logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}
为避免重复注销代码并遵循 DRY,您可以
- 在Auth/LoginController中添加自定义注销路由,调用
Auth::logout()
和 return 重定向到您的路径,或
- 添加一个after-中间件(比如redirectAfterLogout)并将其添加到注销路由
只需在 routes/web 中使用它即可。php
Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});
Laravel > 5.7
接受的答案很好,但您可以通过简单地覆盖 loggedOut
方法来完全绕过任何注销逻辑:
// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request) {
return redirect('/where/ever/you/want/to/go');
}
接受的答案很好,但您可以通过简单地覆盖 loggedOut 方法来完全绕过任何注销逻辑:
protected function loggedOut(Request $request) {
return redirect('/where/ever/you/want/to/go');
}
假设有人现在正在查看它,并且他们使用的 laravel 版本是 5.7
在LoginController.php
中添加这一行
public function logout()
{
Auth::logout();
return redirect()->to('/your-route');
}
这假设您使用的是 laravel
提供的开箱即用的身份验证模块
在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');;
}
Illuminate 支持包:覆盖 LoginController.php
中的注销方法
use Illuminate\Support\Facades\Auth;
public function logout()
{
Auth::logout();
return redirect('/wherever/you/want');
}
如果我们查看 Laravel 的默认注销功能的 AuthenticatesUsers 特征代码(位于 vendor/laravel/ui/auth-backend/AuthenticatesUsers 下 laravel 7),我们将看到用于重定向的硬编码路径。这意味着我们需要从源代码更改 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');
}
在我的例子中,我希望它在注销后将用户重定向到主页 '/home'
,但它一直将他重定向到登录页面
原因是默认HomeController
使用了auth中间件
我不得不从 __construct
方法中删除这一行 $this->middleware('auth');
我刚刚将一个旧网站更新为 Laravel 5.3。这涉及从 Laravel Github as advised in the upgrade guide 添加 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 月数据)
中对我有用
有没有优雅的解决方法可以在退出后重定向到特定页面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/
我用的是Laravel-5.2,我用的是:
public function logout()
{
Auth::logout();
Session::flush();
return redirect('/');
}
确保您已导入:
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
在你的控制器中。
每个注销操作都会触发一个事件 Events\Logout
。您可以创建一个侦听此事件的侦听器并向其中添加一些逻辑。在此处查看有关听众的更多信息 https://laravel.com/docs/5.3/events
我会继承 LoginController
并覆盖来自其中特征的 logout
函数:
LoginController.php -> 保持原样。
我的LoginController.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 路由。
最简单的方法是像这样在 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');
}
你可以去 vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php
在函数 logout
中将 return redirect('/');
更改为您的路由地址。
我就是这样做的。在 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 原则(不要'重复你自己)并尽可能多地重复使用代码。
laravel 5.3 中的 Auth::routes 方法为 /logout 注册了一个 POST 路由,而不是 GET 路由。这可以防止其他 Web 应用程序将您的用户从您的应用程序中注销。要升级,您应该将注销请求转换为使用 POST 动词,或者通过将此路由添加到文件 Routes/web.php 来为 /logout URI 注册您自己的 GET 路由: -
Route::get('/logout', 'Auth\LoginController@logout');
它应该可以正常工作并将您重定向到 LoginController.php
中定义的“/”目录引用自:-
如果您使用开箱即用的 AuthController,请将此变量添加到顶部,然后更改字符串以重定向到您想要的任何位置。
protected $redirectAfterLogout = '/';
AuthenticatesUsers class 具有检查此变量的注销功能。
public function logout()
{
Auth::guard($this->getGuard())->logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}
为避免重复注销代码并遵循 DRY,您可以
- 在Auth/LoginController中添加自定义注销路由,调用
Auth::logout()
和 return 重定向到您的路径,或 - 添加一个after-中间件(比如redirectAfterLogout)并将其添加到注销路由
只需在 routes/web 中使用它即可。php
Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});
Laravel > 5.7
接受的答案很好,但您可以通过简单地覆盖 loggedOut
方法来完全绕过任何注销逻辑:
// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request) {
return redirect('/where/ever/you/want/to/go');
}
接受的答案很好,但您可以通过简单地覆盖 loggedOut 方法来完全绕过任何注销逻辑:
protected function loggedOut(Request $request) {
return redirect('/where/ever/you/want/to/go');
}
假设有人现在正在查看它,并且他们使用的 laravel 版本是 5.7
在LoginController.php
中添加这一行public function logout()
{
Auth::logout();
return redirect()->to('/your-route');
}
这假设您使用的是 laravel
提供的开箱即用的身份验证模块在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');;
}
Illuminate 支持包:覆盖 LoginController.php
中的注销方法 use Illuminate\Support\Facades\Auth;
public function logout()
{
Auth::logout();
return redirect('/wherever/you/want');
}
如果我们查看 Laravel 的默认注销功能的 AuthenticatesUsers 特征代码(位于 vendor/laravel/ui/auth-backend/AuthenticatesUsers 下 laravel 7),我们将看到用于重定向的硬编码路径。这意味着我们需要从源代码更改 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');
}
在我的例子中,我希望它在注销后将用户重定向到主页 '/home'
,但它一直将他重定向到登录页面
原因是默认HomeController
使用了auth中间件
我不得不从 __construct
方法中删除这一行 $this->middleware('auth');
我刚刚将一个旧网站更新为 Laravel 5.3。这涉及从 Laravel Github as advised in the upgrade guide 添加 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 月数据)
中对我有用