web-dev-qa-db-fra.com

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

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?

11
Anu Mathew

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;
}
23
Anu Mathew

Pour s'appuyer sur 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;
}
8
Christian

Ceci 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;
        }
4
Jay Chand

Je n'ai pas travaillé en drupal 8 pour l'instant mais selon la documentation drupal_goto est supprimé de Drupal 8.

Au lieu de drupal_goto vous 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 classe RedirectResponse

4
Sumit Madan

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'exceptions ou d'erreurs, 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!

1
Junkuncz

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();
0
Matoeil