2016-09-05 15 views
28

Gibt es keine elegante Lösung, um nach dem Abmelden in Laravel 5.3 auf eine bestimmte Seite umzuleiten?Wie Laravel 5.3 Logout Redirect Pfad einstellen?

Die Funktion ist von dem Merkmal aufgerufen wird AuthenticatesUsers:

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

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

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

    return redirect('/'); 
} 

Dies ist eine Standardfunktion von dem Kern Laravel. Also muss ich die ganze Funktion überschreiben, die ich nicht bearbeiten kann. Aber gibt es keine einfachere Lösung, weil es sich wie Overkill anfühlt, sich manuell abzumelden, zu spülen und wieder zu regenerieren.

+0

Welche Änderungen möchten Sie tun? – C2486

+0

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

+1

Ich hoffe auf etwas einfaches, dass ich in meinem LoginController etwas wie 'protected $ logoutRedirectPath = 'mein/pfad /';' setzen kann, aber dann sollte die logout-Methode 'return property_exists ($ this, 'logoutRedirectPath') sein? $ this-> logoutRedirectPath: '/'; ' –

Antwort

32

So habe ich es gemacht. In Auth \ LoginController Sie haben:

use AuthenticatesUsers; 

Ändern Sie es an:

use AuthenticatesUsers { 
    logout as performLogout; 
} 

Dann definieren Sie eine neue logout() Methode in Ihrer LoginController:

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

Sicher, regelmäßige logout() Verfahren, dass Trait hat nur 3 Zeilen (um Benutzer aus dem System zu loggen), so dass Sie sie in Ihre Methode kopieren können, aber Sie sollten immer dem DRY-Prinzip folgen (wiederholen Sie sich nicht) und r e-verwenden Sie so viel Code wie Sie können.

+1

Wow, irgendwie habe ich deine Antwort verpasst, das ist definitiv die sauberste Lösung! –

1

Wenn Sie umleiten möchten, setzen Sie einfach die Rückleitungsumleitung ('/'); Umleitung ('yourroute') zurückgeben;

+1

Dies ist eine Standardfunktion aus dem Kern von Laravel. Also muss ich die ganze Funktion außer Kraft setzen, die ich nicht bearbeiten kann –

4

Ich verwende Laravel-5.2, was ich früher war:

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

Achten Sie darauf, Sie importiert haben:

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

In dem Controller.

+0

Ich hatte Angst davor. Ich denke, es ist ziemlich hässlich. Es hätte möglich sein sollen, dem LoginController (AuthController in 5.2) einfach eine Eigenschaft hinzuzufügen, etwa mit dem Attribut 'protected $ logoutRedirectPath = 'path';' –

1

Jede Abmeldeaktion löst ein Ereignis Events\Logout aus. Sie können einen Listener erstellen, der dieses Ereignis überwacht und dort Logik hinzufügt. Sehen Sie mehr über hier Zuhörer https://laravel.com/docs/5.3/events

+0

Das Ereignis gefunden und ausgelöst. Aber etwas hält es davon ab, umzuleiten. Innerhalb des Ereignisses hatte ich 'return redirect() -> route ('admin :: login');' aber es wurde nicht ausgelöst. Event wäre zumindest ein bisschen sauberer. Auch eine normale 'header ('Location: /');' hat nicht funktioniert. –

9

ich LoginController erben und überschreiben die logout Funktion aus dem Zug dort kommen:

LoginController.php -> verlassen, dass, wie es ist.

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); 
    } 
} 

Natürlich sollten Sie Ihre Auth Routen entsprechend aktualisieren erinnern.

+2

Benutzte dies bereits. Es ist jedoch nicht erforderlich, den LoginController zu erweitern, da die Controller zur Änderung geöffnet sind. Fügen Sie einfach die Methode zu LoginController hinzu. Ursache Die Methode befindet sich in einem Merkmal, das im LoginController verwendet wird.Dies scheint die Lösung zu sein, eine Umleitung wird nicht innerhalb eines Ereignisses ausgelöst, so dass Ereignisse keine Option sind. –

+1

Sie haben Recht, es ist völlig in Ordnung, die 'Logout'-Überschreibung im LoginController selbst zu definieren, ich möchte nur Dinge behalten das ist nicht in meinen eigenen separaten Dateien "eingebaut". –

+0

in Laravel 5.3 hat es nicht funktioniert !? – masood

2

Der einfachste Weg ist Logout-Merkmal bei LoginController in App\Http\Controllers\Auth\LoginController wie diese

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

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

Das muss nur etwa 3 mal erwähnt werden. –

-2

Sie vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php in Funktion logout Änderung return redirect('/'); zu Ihrer Route Adresse gehen können außer Kraft zu setzen.

+5

Das ist sehr schlechte Übung! Wenn Sie 'Composer Update' ausführen, ist Ihre Änderung weg. Ändern Sie niemals Dateien im Herstellerordner. –

3

Die Methode Auth :: routes in Laravel 5.3 registriert eine POST-Route für/logout anstelle einer GET-Route. Dies verhindert, dass andere Webanwendungen Ihre Benutzer aus Ihrer Anwendung protokollieren. So aktualisieren, sollten Sie entweder Ihre Abmeldeanforderungen wandeln die Postverb verwenden oder einfach nur Ihre eigene Route planen registrieren Sie sich für den/logout URI durch diesen Weg zu der Datei hinzufügen Routen/web.php: -

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

und funktionieren und leiten Sie sollten dem ‚/‘ Verzeichnis, wie es von der LoginController.php

Zitat definiert ist: -

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

+0

Danke das war sehr hilfreich –

1

Wenn Sie die aus dem Kasten heraus AuthController fügen Sie diese verwenden Variable nach oben und dann c Ändern Sie die Zeichenfolge so, dass sie umgeleitet wird, wo immer Sie möchten.

Die AuthenticatesUsers-Klasse verfügt über eine Abmeldefunktion, die nach dieser Variablen sucht.

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

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

zu vermeiden abzumelden Code wiederholen und DRY zu folgen, Sie

  • in Auth/LoginController, rufen Auth::logout() und zurück Umleitung auf Ihrem Weg oder
  • eine individuelle Abmelde Route hinzufügen kann
  • Fügen Sie eine nach -middleware hinzu (z. B. redirectAfterLogout) und fügen Sie sie der Abmelderoute
  • hinzu verwenden diese
0

Nur in Routen/web.php

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