Mit welcher Funktion / Methode kann ich Benutzer auf eine andere Seite umleiten?

11

In Drupal 7 verwende ich den folgenden Code.

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

Welchen Code soll ich in Drupal 8 verwenden?

Anu Mathew
quelle
3
drupal.org/node/2023537 ist der Änderungsdatensatz für drupal_goto (). Wenn Sie nach einem Ersatz für eine bestimmte Funktion suchen, schauen Sie zuerst dort nach.
Berdir

Antworten:

23

Dies ist der Code, der in Drupal 8 verwendet werden sollte. Weitere Informationen finden Sie unter Änderungsdatensatz .

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path);
  $response->send();
  return;
}
Anu Mathew
quelle
6
Vergessen Sie nicht hinzuzufügenuse Symfony\Component\HttpFoundation\RedirectResponse;
Matt Fletcher
Dies ist ein HttpFoundation-Code auf niedriger Ebene, der in einer Symfony-Anwendung nicht geeignet ist (siehe symfony.com/doc/current/components/…) .
Benutzer89751
8

Um auf Anu Mathews Antwort aufzubauen ;

Um einen Statuscode hinzuzufügen, ist dies nur der zweite Parameter in der RedirectResponse-Klasse.

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}
Christian
quelle
1
Für mich scheint dies nur einmal zu funktionieren und muss jedes Mal gelöscht werden, wenn Sie möchten, dass es wieder funktioniert. Gibt es einen Weg, das zu umgehen?
Matt
@
Matt
4

Ich habe noch nicht in Drupal 8 gearbeitet, aber gemäß der Dokumentation wurde drupal_gotoes aus Drupal 8 entfernt.

Anstelle von müssen drupal_gotoSie schreiben:

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

und so etwas mit Parametern:

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

Überprüfen Sie hier https://www.drupal.org/node/2023537 und Klasse RedirectResponse

Sumit Madan
quelle
Vielen Dank für Ihre Antwort. Aber wie kann ich den Routennamen von der aktuellen URL erhalten (da die URL mithilfe des Konfigurationsformulars eingestellt wird)
Anu Mathew
Du meinst, der Umleitungspfad ist dynamisch ???
Sumit Madan
Ja, dein Recht ist dynamisch.
Anu Mathew
Ok, versuchen Sie, durch \Drupal::url('route.name')Ihre URL oder vielleicht absolute URL zu ersetzen .
Sumit Madan
return new RedirectResponse ($ absolute_url); wird für mich gearbeitet :) Aber es zeigt die Meldung "Weiterleiten an example.com/absolute_url " auf dem Bildschirm
Anu Mathew
4

Dies kann erreicht werden, indem integrierte EventDispatcher-Komponenten für Symphonien genutzt werden. Sie müssen lediglich ein benutzerdefiniertes Modul erstellen. Fügen Sie Ihre Datei services.yml hinzu und geben Sie die entsprechende Dienstkonfiguration an.

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

Fügen Sie im Verzeichnis src Ihrer Module Ihre EventSubscriber.php-Klasse hinzu und beschreiben Sie hier Ihre Methoden.

    <?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
quelle
$ url ist nicht definiert.
Dan Shumaker
1

Der für mich perfekt funktionierende Redirect-Code lautet wie folgt:

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

In allen anderen Fällen erhalte ich Ausnahmen oder Fehler, zum Beispiel: LogicException: Der Controller muss eine Antwort zurückgeben ...

ODER

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

Es gibt bereits eine Diskussion darüber, hoffe das hilft!

Junkuncz
quelle
0

Dies funktioniert für die interne oder externe Umleitung:

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
quelle