Какую функцию/метод я могу использовать для перенаправления пользователей на другую страницу?
В Drupal 7 я использую следующий код.
function my_goto($path) {
drupal_goto($path, array(), 301);
}
Какой код я должен использовать в Drupal 8?
6 answers
Это код, который следует использовать в Drupal 8. См. изменение записи для получения дополнительной информации.
use Symfony\Component\HttpFoundation\RedirectResponse;
function my_goto($path) {
$response = new RedirectResponse($path);
$response->send();
return;
}
Чтобы развить ответ Ану Мэтью;
Чтобы добавить код состояния, это всего лишь второй параметр в классе RedirectResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
function my_goto($path) {
$response = new RedirectResponse($path, 302);
$response->send();
return;
}
Этого можно достичь, используя встроенный компонент symphonies EventDispatcher. Все, что вам нужно сделать, это создать пользовательский модуль. Добавьте свои услуги.файл yml и предоставьте соответствующую конфигурацию службы.
services:
mymodue.subscriber:
class: Drupal\my_module\EventSubscriber
tags:
- { name: event_subscriber }
В каталоге src Ваших модулей добавьте EventSubscriber.php класс и опишите свои методы здесь.
<?php
namespace Drupal\my_module;
use Drupal\Core\Url;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class EventSubscriber implements EventSubscriberInterface {
public function checkForCustomRedirect(RequestEvent $event) {
$request = $event->getRequest();
$route_name = $request->attributes->get('_route');
if($route_name === 'module.testPage') {
$url = Url::fromRoute('<front>')->toString();
$event->setResponse(new RedirectResponse($url));
}
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [KernelEvents::REQUEST => [['checkForCustomRedirect']]];
}
}
Я еще не работал в drupal 8, но в соответствии с документацией drupal_goto
удален из Drupal 8.
Вместо drupal_goto
вам нужно написать:
return new RedirectResponse(\Drupal::url('route.name'));
И что-то вроде этого с параметрами:
return new RedirectResponse(\Drupal::url('route.name', [], ['absolute' => TRUE]));
Проверьте здесь https://www.drupal.org/node/2023537 и перенаправление ответа класса
Идеально работающий код перенаправления для меня выглядит следующим образом:
$response = new RedirectResponse($path);
return $response->send();
В любых других случаях я получаю какие-то исключения или ошибки, например: Исключение LogicException: Контроллер должен вернуть ответ...
ИЛИ
Https://www.drupal.org/project/drupal/issues/2852657
Об этом уже идет дискуссия, надеюсь, это поможет!
Это работает для внутреннего или внешнего перенаправления:
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();