Il y a de nombreuses figures de cas où une application doit retourner à la page précédente. Ce sera le cas, par exemple, lorsqu'on modifie un produit en cliquant sur le bouton de modification sur sa fiche. On voudra revenir à cette fiche une fois la modification faite.
Dans cet article, je vous montre comment retourner à la page précédente dans une application Laravel ou encore comment retrouver l'adresse relative ou absolue de la page précédente.
La façon la plus facile pour retourner à la page précédente est d'utiliser la fonction back() :
return back();
La méthode redirect() permet également d'y parvenir. On devra lui passer en paramètre l'URL de la page précédente à l'aide de url()->previous().
return redirect(url()->previous());
▼Publicité Le texte se poursuit plus bas
Et si on avait besoin de connaître l'URL de la page précédente sans pour autant faire une redirection immédiatement ?
Laravel saura retrouver d'où on vient à l'aide de l'instruction suivante :
$precedent = url()->previous();
Si la page précédente était la page d'accueil, la variable $precedent vaudra http://mondomaine.com. Si c'était la page de contact, elle vaudra http://mondomaine.com/contact.
On obtiendra le même résultat avec :
$precedent = back()->getTargetUrl();
Prenons le cas où est est sur une page quelconque de l'applicaton Web, disons la liste des produits, et qu'on clique sur un bouton qui mène à un formulaire d'ajout. Si on veut revenir à la liste des produits après l'enregistrement, il faudra prendre quelques précautions.
En effet, les méthodes store() et update() d'un contrôleur sont généralement appelées dans un postback. Ceci fait en sorte que le return back() retournera à la méthode qui les a appelées, c'est-à-dire la méthode qui affiche le formulaire.
Pour vérifier ce fait, regardez la valeur de back()->getTargetUrl() dans la méthode edit(). Vous obtiendrez une chaîne du genre : http://monprojet.test/produits.
Et dans la méthode store(), vous obtiendrez : http://monprojet.test/produits/creation, soit la page qui affiche le formulaire. Cette dernière n'est donc d'aucune utilité puisqu'on désire plutôt aller à la page qui était affichée AVANT que le formulaire soit affiché.
Pour contourner ce problème, il est possible de retenir l'URL de la page précédente dans la méthode qui affiche le formulaire et de la stocker dans une variable de session qui pourra être utilisée dans le store() ou dans le update().
Ex :
public function create(): View
{
// Pour éviter que la valeur soit réassignée si on revient ici après erreur de validation
if (!session()->has('pageAvantAjoutProduit')) {
// On retient ici l'URL de la page d'avant car dans le update() la page d'avant reviendrait ici
session( [ 'pageAvantAjoutProduit' => back()->getTargetUrl() ] );
}
...
return view('produits.create');
}
public function store(ProduitRequest $request): RedirectResponse
{
...
$redirection = session('pageAvantAjoutProduit');
// En remettant la variable de session à null, le create() pourra retenir à nouveau l'URL de la page d'avant
session(['pageAvantAjoutProduit' => null]);
return redirect($redirection);
}
Il n'existe pas de fonction préprogrammée pour trouver l'URL de la page précédente sans le nom de domaine. Qu'à cela ne tienne, il est possible d'utiliser la fonction PHP preg_replace() pour faire le travail.
Avec l'instruction suivante, si la page précédente était la page d'accueil, la variable $precedent vaudra /. Si c'était la page http://mondomaine.com/contact, elle vaudra contact.
Ce comportement est cohérent avec les résultats obtenus quand on recherche l'URL de la page actuelle sans le nom de domaine.
Ex :
$precedent = url()->previous() == url('/') . '/' ? '/' : preg_replace('@' . url('/') . '/@', '', url()->previous());
Quelques explications s'imposent.
Si vous avez à travailler régulièrement avec l'URL de la page précédente sans le nom de domaine, je vous conseille fortement de placer cet extrait de code dans un bibliothèque de fonction afin de rendre votre code plus clair et faciliter la maintenance de vote application Web.
Site fièrement hébergé chez A2 Hosting.