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?


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

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

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


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

$ 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!


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();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.