Formation PUB030 : Laravel, 2019 La redirection

Page précédente


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() :

Contrôleur Laravel (PHP)

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().

Contrôleur Laravel (PHP)

return redirect(url()->previous());

▼Publicité

URL de la page précédente

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 :

Contrôleur Laravel (PHP)

$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 :

Contrôleur Laravel (PHP)

$precedent = back()->getTargetUrl();

Page précédente dans la méthode store() ou update()

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 :

Contrôleur Laravel (PHP)

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

}

URL de la page précédente sans le nom de domaine

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 :

Contrôleur Laravel (PHP)

$precedent = url()->previous() == url('/') . '/' ? '/' : preg_replace('@' . url('/') . '/@', '', url()->previous());

Quelques explications s'imposent.

  • le premier paramètre de preg_replace() est le patron à rechercher, que l'on doit entourer par un délimiteur. Le caractère @ a été choisi mais tout autre caractère non utilisé dans le patron aurait pu faire l'affaire.
  • la fonction url('/') retourne une chaîne sous la forme « http://mondomaine.com ». Donc, si on enlève cette chaîne de l'URL, on aura « /contact » plutôt que « contact », comme désiré. C'est pourquoi il a fallu ajouter un « / » avant le dernier délimiteur.
  • Lorsque la page précédente est la page d'accueil, on veut conserver le « / ». C'est pourquoi on a ajouté un opérateur ternaire (?:) afin d'avoir un traitement différent pour la page d'accueil.

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.

Dernière révision le 28 mars 2019
Merci de partager !

▼Publicité

Site fièrement hébergé chez A2 Hosting

A2 Hosting

Soumettre