web-dev-qa-db-fra.com

Qu'est-il arrivé à la méthode redirectTo () de Laravel?

Nous pouvons remplacer cette propriété pour rediriger les utilisateurs après la connexion à LoginController:

protected $redirectTo = '/home';

Et voici la déclaration de la documentation:

Si le chemin de redirection nécessite une logique de génération personnalisée, vous pouvez définir un fichier Méthode redirectTo au lieu d'une propriété redirectTo:

fonction protégée redirectTo () { 
//}

Mais il redirige toujours vers '/home'; quelle que soit la condition.

protected function redirectTo()
{
  if (Auth::user()->role==0) {
    return '/volunteer';
  } else {
    return '/donor';
  }
}

Si une méthode existe, elle l'utilisera, sinon la propriété sera utilisée. Mais il semble que la propriété est utilisée même si la méthode existe.

Cependant, remplacer la fonction authenticated() ou sendLoginResponse() fonctionne correctement.

protected function authenticated()
    {
      if (Auth::user()->role==0) {
        return redirect('/volunteer') ;
      } else {
        return redirect('/donor');
      }
    }

Quel est le problème avec la méthode redirectTo() là-bas? Voici le code source de GitHub à ces méthodes.

J'utilise Laravel version 5.3.28.

14
Sanzeeb Aryal

Ceci est la méthode redirectPath() dans src/Illuminate/Foundation/Auth/RedirectsUsers.php dans Laravel v5.3.28

public function redirectPath()
{
    return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

Dans les dernières versions 5.3.29 et supérieures. Cela a été changé dans le fichier avec commit:

Ajout d'une méthode de génération de chemin de redirection d'authentification (# 16896)

 public function redirectPath()
 {
     if (method_exists($this, 'redirectTo')) {
         return $this->redirectTo();
     }
     return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
 }

Donc, cette partie de la documentation s'applique à Laravel version 5.3.29 et ultérieure uniquement

Si le chemin de redirection nécessite une logique de génération personnalisée, vous pouvez définir un fichier Méthode redirectTo au lieu d'une propriété redirectTo:

fonction protégée redirectTo () {//}


Solution pour v5.3.28

Pour que la méthode redirectTo() fonctionne dans la version 5.3.28, ajoutez-la manuellement à la méthode redirectPath() dans src/Illuminate/Foundation/Auth/RedirectsUsers.php.

if (method_exists($this, 'redirectTo')) {
    return $this->redirectTo();
}
11
Sanzeeb Aryal

Solution simple

Remplacez redirectPath() au lieu de redirectTo().

Utiliser un retour de chaîne brute:

protected function redirectPath()
{
  if (Auth::user()->role==0) {
    return '/volunteer';
  } else {
    return '/donor';
  }
}

Ou redéfinir redirectPath() sur la version Laravel 5.3. 29 redirectPath() pour que votre méthode redirectTo() fonctionne.

public function redirectPath()
{
  if (method_exists($this, 'redirectTo')) {
   return $this->redirectTo();
  }     
  return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}

Pourquoi redirectTo () ne fonctionne pas

Testés en remplaçant la méthode redirectPath() ou redirectTo() dans App\Http\Controllers\Auth\LoginController.php sur une version propre Laravel v.5.3.29 + par défaut, ils fonctionnent comme prévu.

Exemple de méthode redirectTo ()

La documentation dit:

Si le chemin de redirection nécessite une logique de génération personnalisée, vous pouvez définir une méthode redirectTo au lieu d'une propriété redirectTo.

Donc, la fonction doit ressembler à ceci:

protected function redirectTo()
{
    if(condition) {
      return "/your/path";
    } 
    return "/your/secondpath";
}
7
Troyer

redirectTo redirige les utilisateurs ayant terminé la connexion ou l'enregistrement. Les utilisateurs déjà connectés et essayant de s'enregistrer ou de se reconnecter seront redirigés par app/Http/Middleware/RedirectIfAuthenticated.php

if (Auth::guard($guard)->check()) {
    return redirect('/home');
}
1
Arthur Tarasov

Je pense que le problème vient des routes web.php. Je suis parti après avoir défini la route par défaut '/' pour pointer vers la page de connexion.

Route::get('/', function () {
    return redirect(route('login'));
});
0
Thungdemo