[英]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/
我就是這樣做的。 在 Auth\\LoginController 你有:
use AuthenticatesUsers;
將其更改為:
use AuthenticatesUsers {
logout as performLogout;
}
然后,在 LoginController 中定義一個新的logout()
方法:
public function logout(Request $request)
{
$this->performLogout($request);
return redirect()->route('your_route');
}
當然,該 trait 中的常規logout()
方法只有 3 行(用於將用戶從系統中注銷),因此您可以將它們復制到您的方法中,但您應該始終遵循 DRY 原則(不要重復自己)並重新- 使用盡可能多的代碼。
接受的答案很好,但您可以通過簡單地覆蓋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.7
在 LoginController.php 中添加這一行
public function logout()
{
Auth::logout();
return redirect()->to('/your-route');
}
這假設您使用的是 laravel 提供的開箱即用的身份驗證模塊
laravel 5.3 中的 Auth::routes 方法為 /logout 注冊了一個 POST 路由,而不是一個 GET 路由。 這可以防止其他 Web 應用程序將您的用戶從您的應用程序中注銷。 要升級,您應該將注銷請求轉換為使用 POST 動詞,或者通過將此路由添加到文件 Routes/web.php 來為 /logout URI 注冊您自己的 GET 路由:-
Route::get('/logout', 'Auth\LoginController@logout');
它應該可以正常工作並將您重定向到“/”目錄,因為它在 LoginController.php 中定義
引用自:-
只需在 routes/web.php 中使用它
Route::get('logout', function (){
Auth::logout();
return redirect('your URL');
});
每個注銷操作都會觸發一個事件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');
}
如果您使用的是開箱即用的 AuthController,請將此變量添加到頂部,然后將字符串更改為重定向到您想要的任何位置。
protected $redirectAfterLogout = '/';
AuthenticatesUsers 類具有檢查此變量的注銷函數。
public function logout()
{
Auth::guard($this->getGuard())->logout();
return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}
為避免重復注銷代碼並遵循 DRY,您可以
Auth::logout()
並返回重定向到您的路徑,或接受的答案很好,但您可以通過簡單地覆蓋loggedOut方法來完全繞過觸及任何注銷邏輯:
protected function loggedOut(Request $request) {
return redirect('/where/ever/you/want/to/go');
}
在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 trait 上的默認注銷功能代碼(位於 laravel 7 的 vendor/laravel/ui/auth-backend/AuthenticatesUsers 下),我們將看到用於重定向的硬編碼路徑。 這意味着我們需要從源代碼更改 url,但是通過供應商編輯文件是錯誤的方式,但是特征為我們提供了一種更好的方法,我們可以覆蓋代碼 所以只需將所有注銷函數的代碼粘貼到 LoginController 頁面並更改重定向('/')函數的參數到你想要的任何網址。 目前我的代碼看起來就像那些只是將它放在 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 中間件
我不得不刪除這一行$this->middleware('auth');
從__construct
方法
我剛剛將一個舊網站更新到 Laravel 5.3。 這包括按照升級指南中的建議從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 月)
你可以去vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Auth\\AuthenticatesUsers.php
中的函數logout
更改return redirect('/');
到您的路線地址。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.