65 votes

Comment définir le chemin de redirection de la déconnexion de Laravel 5.3 ?

Existe-t-il une solution élégante pour rediriger vers une page spécifique après la déconnexion dans Laravel 5.3 ?

La fonction appelée est issue du trait Authentifie les utilisateurs :

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

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

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

    return redirect('/');
}

C'est une fonction par défaut du noyau de Laravel. Je dois donc remplacer toute la fonction, je ne peux pas modifier le noyau. Mais il n'y a pas une solution plus simple, parce que j'ai l'impression que c'est exténuant de se déconnecter manuellement, de vider et de régénérer à nouveau.

J'ai trouvé les réponses dans un article : https://codeneverlied.com/how-to-set-logout-redirect-path-in-laravel-5-8-and-before/

0 votes

Quels sont les changements que vous voulez faire ?

0 votes

Return redirect()->route('yourroute') ;

1 votes

J'espère que quelque chose de simple que je peux définir dans mon LoginController quelque chose comme protected $logoutRedirectPath = 'my/path/'; mais alors la méthode de déconnexion aurait dû être return property_exists($this, 'logoutRedirectPath') ? $this->logoutRedirectPath : '/';

90voto

Avram Points 634

Voici comment j'ai procédé. Dans Auth \LoginController vous avez :

use AuthenticatesUsers;

Changez-le en :

use AuthenticatesUsers {
    logout as performLogout;
}

Ensuite, définissez une nouvelle logout() dans votre LoginController :

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

Bien sûr, normal logout() dans ce trait ne comporte que 3 lignes (utilisées pour déconnecter les utilisateurs du système), vous pouvez donc les copier dans votre méthode, mais vous devez toujours suivre le principe DRY (ne pas se répéter) et réutiliser autant de code que possible.

0 votes

Bonjour @avram, j'ai une question concernant la syntaxe de l'expression suivante use … { … as … } . Cela ressemble à un peu d'importation/déconstuction. Savez-vous quel est le nom de cette syntaxe/modèle ? Merci pour votre aide, cela fonctionne sur le projet sur lequel je travaille !

2 votes

@meduz' Je ne suis pas sûr de la façon dont cela s'appelle, je viens de le trouver dans la documentation PHP : php.net/manual/en/

3 votes

La seule chose qui n'est pas mentionnée est l'inclusion use Illuminate\Http\Request; dans le LoginController.

64voto

Chris Points 3371

Laravel > 5.7

La réponse acceptée est bonne, mais vous pouvez complètement éviter de toucher à la logique de déconnexion en écrasant simplement le fichier loggedOut méthode :

// App\Http\Controllers\Auth\LoginController.php
protected function loggedOut(Request $request) {
    return redirect('/where/ever/you/want/to/go');
}

0 votes

Pas d'inquiétude. J'ai juste fait un peu de recherche dans le code source.

1 votes

Fonctionne aussi en 5.6

0 votes

Bonjour, puis-je demander dans quel fichier je dois remplacer cette méthode ?

15voto

Kaloyan Doichinov Points 802

J'hériterais LoginController et remplacer le logout fonction venant du trait là-dedans :

LoginController.php -> laissez cela tel quel.

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

Bien sûr, vous devez vous souvenir de mettre à jour vos routes Auth en conséquence.

3 votes

Je l'utilisais déjà. Mais il n'est pas nécessaire d'étendre LoginController puisque les contrôleurs sont ouverts à la modification. Il suffit d'ajouter la méthode à LoginController. Parce que la méthode est dans un trait qui est utilisé dans LoginController. Cela semble être la solution, une redirection n'est pas déclenchée dans un événement, donc les événements ne sont pas une option.

1 votes

Vous avez raison, il est tout à fait possible de définir l'élément logout dans le LoginController lui-même, j'aime garder les choses qui ne sont pas "intégrées" dans mes propres fichiers séparés.

1 votes

Fonctionne comme un charme dans laravel 5.3, mais vous pouvez directement éditer le LoginController et surcharger la méthode de déconnexion - de toute façon, il serait bien que ce soit implémenté comme la redirection après une connexion réussie.

10voto

Sachith Points 1444

J'utilise Laravel-5.2 ce que j'ai utilisé est :

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

Assurez-vous que vous avez importé :

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

Dans votre contrôleur.

0 votes

J'avais peur de ça. Je pense que c'est assez laid. Il aurait dû être possible d'ajouter une propriété au LoginController (AuthController en 5.2) avec quelque chose comme protected $logoutRedirectPath = 'path';

1 votes

Merci pour cette réponse. Puis-je en connaître la source si possible (ou si vous vous en souvenez ?), +1 pour vous mon ami.

0 votes

@IslamElshobokshy désolé, je ne m'en souviens pas maintenant, cela fait des années :)

6voto

Mohamed Gabr Points 361

La méthode Auth::routes dans laravel 5.3 enregistre une route POST pour /logout au lieu d'une route GET. Cela empêche les autres applications web de déconnecter vos utilisateurs de votre application. Pour mettre à jour, vous devez soit convertir vos demandes de déconnexion pour utiliser le verbe POST, soit enregistrer votre propre route GET pour l'URI /logout en ajoutant cette route au fichier Routes/web.php:-.

Route::get('/logout', 'Auth\LoginController@logout');

et cela devrait fonctionner correctement et vous rediriger vers le répertoire '/' tel qu'il est défini dans le LoginController.php.

Cité par:-

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

0 votes

Merci, c'était très utile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X