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?
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?
Odpowiedzi:
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;
}
use Symfony\Component\HttpFoundation\RedirectResponse;
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;
}
Nie pracowałem jeszcze w drupal_goto
Drupal 8, ale zgodnie z dokumentacją został usunięty z Drupal 8.
W miejscu drupal_goto
musisz 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
\Drupal::url('route.name')
swoim adresem URL lub być może adresem bezwzględnym.
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;
}
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!
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();