Jakiej funkcji / metody mogę użyć do przekierowania użytkowników na inną stronę?


12

W Drupal 7 używam następującego kodu.

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

Jakiego kodu powinienem użyć w Drupal 8?


3
drupal.org/node/2023537 to rekord zmian dla drupal_goto (), ilekroć szukasz zamiennika dla określonej funkcji, najpierw tam zajrzyj.
— Berdir,

Odpowiedzi:


24

Jest to kod, który powinien być użyty w Drupal 8. Zobacz zmianę Record, aby uzyskać więcej informacji.

use Symfony\Component\HttpFoundation\RedirectResponse;

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

6
Nie zapomnij dodaćuse Symfony\Component\HttpFoundation\RedirectResponse;
— Matt Fletcher

Jest to kod HttpFoundation niskiego poziomu nieodpowiedni w aplikacji Symfony, patrz symfony.com/doc/current/components/… .
— user89751

8

Budować na odpowiedź anu Mateusza ;

Aby dodać kod stanu, jest to tylko drugi parametr w klasie RedirectResponse;

use Symfony\Component\HttpFoundation\RedirectResponse;

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

1
Dla mnie wydaje się, że działa to tylko raz i trzeba wyczyścić pamięć podręczną za każdym razem, gdy chcesz, aby znów działała. Czy jest na to jakiś sposób?
— Matt


4

Nie pracowałem jeszcze w drupal_gotoDrupal 8, ale zgodnie z dokumentacją został usunięty z Drupal 8.

W miejscu drupal_gotomusisz napisać:

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

i coś takiego z parametrami:

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

Sprawdź tutaj https://www.drupal.org/node/2023537 i klasę RedirectResponse


Dziękuję za odpowiedź. Ale jak mogę uzyskać nazwę trasy z bieżącego adresu URL (Ponieważ adres URL ustawia się za pomocą formularza konfiguracji)
— Anu Mathew

Masz na myśli ścieżkę przekierowania jest dynamiczna ???
— Sumit Madan

Tak, masz rację, jego dynamika ...
— Anu Mathew

Ok, spróbuj zastąpić \Drupal::url('route.name')swoim adresem URL lub być może adresem bezwzględnym.
— Sumit Madan

zwraca nowy RedirectResponse ($ absolut_url); działa dla mnie :) Ale na ekranie wyświetla się komunikat „przekieruj do example.com/absolute_url ”
— Anu Mathew

4

Można to osiągnąć, wykorzystując wbudowane symfonie EventDispatcher Component. Wszystko, co musisz zrobić, to stworzyć niestandardowy moduł. Dodaj plik services.yml i zapewnij odpowiednią konfigurację usługi.

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

w swoim katalogu src modułów dodaj stwórz klasę EventSubscriber.php i opisz tutaj swoje metody.

    <?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 nie jest zdefiniowany.
— Dan Shumaker

1

Dla mnie idealnie działający kod przekierowania jest następujący:

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

W pozostałych przypadkach otrzymuję jakieś wyjątki lub błędy, na przykład: LogicException: Kontroler musi zwrócić odpowiedź ...

LUB

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

Jest już dyskusja na ten temat, mam nadzieję, że to pomaga!


0

działa to w przypadku przekierowania wewnętrznego lub zewnętrznego:

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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.