在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/
这就是我做到的。在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原则(不要重复自己)并重复使用尽可能多的代码。
只需在routes / web.php中使用它
Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});
为避免重复注销代码并遵循DRY,您可以
Auth::logout()
并返回重定向到您的路径,或者接受的答案很好,但您可以通过简单地覆盖loggedOut方法完全绕过触摸任何注销逻辑:
protected function loggedOut(Request $request) {
return redirect('/where/ever/you/want/to/go');
}
在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');;
}
你可以去vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php
功能logout
改变return redirect('/');
到你的路线地址。
接受的答案很好,但您可以通过简单地覆盖loggedOut
方法完全绕过触摸任何注销逻辑:
// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request) {
return redirect('/where/ever/you/want/to/go');
}
我将继承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路线。
我正在使用Laravel-5.2,我使用的是:
public function logout()
{
Auth::logout();
Session::flush();
return redirect('/');
}
确保您已导入:
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
在你的控制器中。
laravel 5.3中的Auth :: routes方法为/ logout而不是GET路由注册POST路由。这可以防止其他Web应用程序将您的用户从您的应用程序中删除。要进行升级,您应该将您的注销请求转换为使用POST动词,或者只是通过将此路由添加到文件Routes / web.php来为/ logout URI注册您自己的GET路由: -
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');
}
假设某人现在正在查看它,他们使用的laravel的版本是5.7
在LoginController.js中添加此行
public function logout()
{
Auth::logout();
return redirect()->to('/your-route');
}
这假设您正在使用laravel提供的开箱即用验证模块
如果您使用现成的AuthController,请将此变量添加到顶部,然后将字符串更改为重定向到您想要的任何位置。
protected $redirectAfterLogout = '/';
AuthenticatesUsers类具有检出此变量的注销功能。
public function logout()
{
Auth::guard($this->getGuard())->logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}