Quale funzione / metodo posso usare per reindirizzare gli utenti a una pagina diversa?


11

In Drupal 7, utilizzo il seguente codice.

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

Quale codice dovrei usare in Drupal 8?


3
drupal.org/node/2023537 è il record di modifica per drupal_goto (), ogni volta che stai cercando un sostituto per una funzione specifica, guarda prima lì.
Berdir,

Risposte:


24

Questo è il codice che dovrebbe essere usato in Drupal 8. Vedi modifica Record per maggiori informazioni.

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path);
  $response->send();
  return;
}

6
Non dimenticare di aggiungereuse Symfony\Component\HttpFoundation\RedirectResponse;
Matt Fletcher,

Questo è un codice HttpFoundation di basso livello non adatto in un'applicazione Symfony, consultare symfony.com/doc/current/components/… .
user89751

8

Per costruire sulla risposta di Anu Mathew ;

Per aggiungere un codice di stato, è solo il secondo parametro nella classe RedirectResponse;

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}

1
Per me questo sembra funzionare solo una volta e deve essere cancellato dalla cache ogni volta che vuoi che funzioni di nuovo. C'è un modo per aggirare questo?
Matt,


4

Non ho ancora lavorato con Drupal 8, ma secondo la documentazione drupal_gotoviene rimosso da Drupal 8.

Al posto di drupal_gotote devi scrivere:

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

e qualcosa del genere con parametri:

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

Controlla qui https://www.drupal.org/node/2023537 e classe RedirectResponse


Grazie per la tua risposta. Ma come posso ottenere il nome del percorso dall'URL corrente (perché l'URL si sta impostando utilizzando il modulo di configurazione)
Anu Mathew,

Vuoi dire che il percorso di reindirizzamento è dinamico ???
Sumit Madan,

Sì, hai ragione è dinamico ...
Anu Mathew il

Ok, prova a sostituire \Drupal::url('route.name')con il tuo URL o forse con l'URL assoluto.
Sumit Madan,

return new RedirectResponse ($ absolute_url); ha funzionato per me :) Ma mostra sullo schermo il messaggio "reindirizza a example.com/absolute_url "
Anu Mathew,

4

Ciò può essere ottenuto sfruttando Symphonies Component EventDispatcher integrato. Tutto quello che devi fare è creare un modulo personalizzato. Aggiungi il tuo file services.yml e fornisci la configurazione del servizio appropriata.

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

nella directory src dei moduli aggiungere creare la classe EventSubscriber.php e descrivere qui i metodi.

    <?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;
        }

$ url non è definito.
Dan Shumaker il

1

Il codice di reindirizzamento perfettamente funzionante per me è il seguente:

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

In tutti gli altri casi ricevo una sorta di eccezioni o errori, ad esempio: LogicException: il controller deve restituire una risposta ...

O

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

C'è già una discussione al riguardo, spero che ti aiuti!


0

funziona per il reindirizzamento interno o esterno:

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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.