Відповіді:
Це код, який слід використовувати в Drupal 8. Для отримання додаткової інформації див. Запис змін .
use Symfony\Component\HttpFoundation\RedirectResponse;
function my_goto($path) {
$response = new RedirectResponse($path);
$response->send();
return;
}
use Symfony\Component\HttpFoundation\RedirectResponse;
На основі відповіді Ану Матвій ;
Щоб додати код статусу, його лише другий параметр у класі RedirectResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
function my_goto($path) {
$response = new RedirectResponse($path, 302);
$response->send();
return;
}
Я ще не працював у 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 та клас RedirectResponse
\Drupal::url('route.name')
URL-адресою або, можливо, абсолютною URL-адресою.
Цього можна досягти, використовуючи вбудовані симфонії Компонент EventDispatcher. Все, що вам потрібно зробити, - це створити спеціальний модуль. Додайте файл services.yml та надайте відповідну конфігурацію служби.
services:
mymodue.subscriber:
class: Drupal\my_module\EventSubscriber
tags:
- { name: event_subscriber }
у каталог ваших модулів src додайте створіть свій клас EventSubscriber.php та опишіть тут методи.
<?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;
}
Для мене ідеально працює код переадресації:
$response = new RedirectResponse($path);
return $response->send();
У будь-яких інших випадках я отримую якісь винятки або помилки, наприклад: LogicException: Контролер повинен повернути відповідь ...
АБО
https://www.drupal.org/project/drupal/isissue/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();