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.