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.