2016-09-05 93 views
28

在Laravel 5.3註銷後,是否沒有優雅的解決方案來重定向到特定的頁面?如何設置laravel 5.3註銷重定向路徑?

被調用的函數是從特質AuthenticatesUsers

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

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

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

    return redirect('/'); 
} 

這是laravel核心默認功能。所以我必須重寫整個函數,我不能編輯核心。 但是沒有更簡單的解決方案,導致手動註銷,刷新和重新生成感覺過度。

+0

什麼樣的變化,你想做什麼? – C2486

+0

return redirect() - > route('yourroute'); – FullStack

+1

我希望能夠在我的LoginController中設置一些類似'protected $ logoutRedirectPath ='my/path /';'但註銷方法應該是'return property_exists($ this,'logoutRedirectPath')? $ this-> logoutRedirectPath:'/';' –

回答

32

這就是我做到的。在驗證\ LoginController中你有:

use AuthenticatesUsers; 

其更改爲:在

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

當然,定期logout()方法:

use AuthenticatesUsers { 
    logout as performLogout; 
} 

然後,在你的LoginController定義新logout()方法trait只有3行(用於將用戶登錄到系統中),因此您可以將它們複製到您的方法中,但您應該始終遵循DRY原則(不要重複自己),並且r儘可能多地使用電子代碼。

+1

哇,不知何故,我錯過了你的答案,這絕對是最乾淨的解決方案! –

1

如果你想重定向,你爲什麼不設置返回重定向('/');返回重定向('yourroute');

+1

這是laravel核心的默認功能。所以我必須覆蓋整個功能,我不能編輯核心 –

4

我使用Laravel-5.2,我用的是什麼:

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

確保您已導入:

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

在您的控制器。

+0

我很害怕這一點。我覺得這很醜陋。應該可以通過類似'protected $ logoutRedirectPath ='path''的方式向LoginController(5.2中的AuthController)添加一個屬性;' –

1

每個註銷操作觸發事件Events\Logout。您可以創建一個偵聽器來偵聽此事件,並在其中添加一些邏輯。查看更多有關這裏的聽衆https://laravel.com/docs/5.3/events

+0

發現事件並觸發它。但有些東西阻止它重定向。在事件內部,我有'return redirect() - > route('admin :: login');'但它沒有被觸發。事件至少會更清潔一些。還使用普通的'header('Location:/');'不起作用。 –

9

我將繼承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); 
    } 
} 

當然,你要記得更新您的驗證路徑。

+2

已經在使用這個。但是不需要擴展LoginController,因爲控制器是可以修改的。只需將該方法添加到LoginController。導致該方法存在於LoginController中使用的特徵中。這似乎是解決方案,重定向沒有在事件內部觸發,所以事件不是一個選項 –

+1

你是對的,在LoginController本身定義'logout'覆蓋是完全正確的,我只是想保留東西這並不是在我自己的單獨文件中「內置」的。 laravel中的 –

+0

5.3它不起作用!? – masood

2

最簡單的方法是在LoginControllerApp\Http\Controllers\Auth\LoginController覆蓋註銷特質這樣

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

    return redirect()->route('you_route_name'); 
} 
+0

這隻有3倍左右。 –

-2

你可以去vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php 在功能logout變化return redirect('/');到您的路由地址。

+5

這是非常不好的做法!如果你運行'composer update',你的改變就消失了。切勿更改供應商文件夾中的文件。 –

3

laravel 5.3中的Auth :: routes方法爲/註銷而不是GET路由註冊POST路由。這可以防止其他Web應用程序將您的用戶從您的應用程序中註銷。要升級,您應該將您註銷請求使用POST動詞或剛剛加入這條航線將文件註冊爲/註銷URI自己GET路線路線/ web.php: -

Route::get('/logout', 'Auth\[email protected]'); 

,它應該正常工作,引導您到「/」目錄,因爲在LoginController.php

的已定義引自: - 如果你正在使用的開箱AuthController添加此

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

+0

感謝這非常有幫助 –

1

變量頂部,然後c將字符串掛起以便重定向到任何你想要的地方。

protected $redirectAfterLogout = '/'; 

AuthenticatesUsers類有一個註銷函數來檢查這個變量。

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

    return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/'); 
} 
0

爲了避免重複註銷代碼,並遵循幹,你可以

  • 添加在驗證定製註銷路線/ LoginController中,叫 Auth::logout()並返回重定向到您的路徑,或
  • 在後添加一個- 中間件(說redirectAfterLogout)並將其添加到註銷路徑
0

只需使用這路線/ web.php

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