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?

Anu Mathew
źródło
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;
}
Anu Mathew
źródło
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;
}
chrześcijanin
źródło
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
@Matt Zobacz drupal.stackexchange.com/a/222700/14151
Matt Fletcher
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

Sumit Madan
źródło
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;
        }
Jay Chand
źródło
$ 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!

Junkuncz
źródło
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();
Matoeil
źródło