Quelle fonction / méthode puis-je utiliser pour rediriger les utilisateurs vers une autre page?

11

Dans Drupal 7, j'utilise le code suivant.

function my_goto($path) { 
  drupal_goto($path, array(), 301);
}

Quel code dois-je utiliser dans Drupal 8?

Anu Mathew
la source
3
drupal.org/node/2023537 est l'enregistrement des modifications pour drupal_goto (), chaque fois que vous recherchez un remplacement pour une fonction spécifique, regardez-le d'abord.
Berdir

Réponses:

24

C'est le code qui devrait être utilisé dans Drupal 8. Voir changer d'enregistrement pour plus d'informations.

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path);
  $response->send();
  return;
}
Anu Mathew
la source
6
N'oubliez pas d'ajouteruse Symfony\Component\HttpFoundation\RedirectResponse;
Matt Fletcher
Il s'agit d'un code HttpFoundation de bas niveau qui ne convient pas dans une application Symfony, voir symfony.com/doc/current/components/… .
user89751
8

S'appuyer sur la réponse d'Anu Mathew ;

Pour ajouter un code d'état, ce n'est que le deuxième paramètre de la classe RedirectResponse;

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}
Christian
la source
1
Pour moi, cela ne semble fonctionner qu'une seule fois, et doit avoir un cache effacé à chaque fois que vous voulez qu'il fonctionne à nouveau. Y a-t-il un moyen de contourner cela?
Matt
@Matt Voir drupal.stackexchange.com/a/222700/14151
Matt Fletcher
4

Je ne travaillais pas encore dans Drupal 8 mais selon la documentation drupal_gotosupprimée de Drupal 8.

Au lieu de drupal_gotovous devez écrire:

return new RedirectResponse(\Drupal::url('route.name'));

et quelque chose comme ça avec des paramètres:

return new RedirectResponse(\Drupal::url('route.name', [], ['absolute' => TRUE]));

Vérifiez ici https://www.drupal.org/node/2023537 et la classe RedirectResponse

Sumit Madan
la source
Merci pour votre réponse, mais comment puis-je obtenir le nom de l'itinéraire à partir de l'URL actuelle (car l'URL est définie à l'aide du formulaire de configuration)
Anu Mathew
Vous voulez dire que le chemin de redirection est dynamique ???
Sumit Madan
Oui, votre droite est dynamique ..
Anu Mathew
Ok essayez de remplacer \Drupal::url('route.name')par votre URL ou peut-être une URL absolue.
Sumit Madan
retourne une nouvelle RedirectResponse ($ absolue_url); est travaillé pour moi :) Mais son message "rediriger vers example.com/absolute_url " s'affiche à l'écran
Anu Mathew
4

Cela peut être réalisé en tirant parti des symphonies intégrées du composant EventDispatcher. Il vous suffit de créer un module personnalisé. Ajoutez votre fichier services.yml et fournissez la configuration de service appropriée.

services:
  mymodue.subscriber:
    class: Drupal\my_module\EventSubscriber
    tags:
      - { name: event_subscriber }

dans le répertoire Your modules src add créez votre classe EventSubscriber.php et décrivez vos méthodes ici.

    <?php
       use Symfony\Component\HttpFoundation\RedirectResponse;

        public function checkForCustomRedirect(GetResponseEvent $event) {     
            $route_name = \Drupal::request()->attributes->get(RouteObjectInterface::ROUTE_NAME);
            if($route_name === 'module.testPage') {
              $event->setResponse(new RedirectResponse($url, $status = 302,$headers);
            }
         }

          /**
           * {@inheritdoc}
           */
        public static function getSubscribedEvents() {
            $events = [];
            $events[KernelEvents::REQUEST][] = array('checkForCustomRedirect');
            return $events;
        }
Jay Chand
la source
$ url n'est pas défini.
Dan Shumaker
1

Le code de redirection fonctionnant parfaitement pour moi est le suivant:

$response = new RedirectResponse($path);
return $response->send();

Dans tous les autres cas, je reçois une sorte d'exception ou d'erreur, par exemple: LogicException: le contrôleur doit renvoyer une réponse ...

OU

https://www.drupal.org/project/drupal/issues/2852657

Il y a déjà une discussion à ce sujet, j'espère que ça aide!

Junkuncz
la source
0

cela fonctionne pour la redirection interne ou externe:

use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Url;

   $url = Url::fromUri('internal:/node/27'); // choose a path
   // $url =  Url::fromUri('https://external_site.com/');
    $destination = $url->toString();
    $response = new RedirectResponse($destination, 301);
    $response->send();
Matoeil
la source