Какую функцию / метод я могу использовать для перенаправления пользователей на другую страницу?

11

В Drupal 7 я использую следующий код.

function my_goto($path) { 
  drupal_goto($path, array(), 301);
}

Какой код я должен использовать в Drupal 8?

Ану Мэтью
источник
3
drupal.org/node/2023537 - это запись об изменениях для drupal_goto (), когда вы ищете замену для определенной функции, сначала посмотрите туда.
Бердир

Ответы:

24

Это код, который следует использовать в Drupal 8. Для получения дополнительной информации см. Запись изменения .

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path);
  $response->send();
  return;
}
Ану Мэтью
источник
6
Не забудьте добавитьuse Symfony\Component\HttpFoundation\RedirectResponse;
Мэтт Флетчер
Этот код HttpFoundation низкого уровня не подходит для приложений Symfony, см. Symfony.com/doc/current/components/… .
user89751
8

Для того, чтобы построить на ответ Ану Мэтью ;

Чтобы добавить код состояния, это просто второй параметр в классе RedirectResponse;

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}
Кристиан
источник
1
Мне кажется, это работает только один раз, и кешировать его нужно каждый раз, когда вы хотите, чтобы это снова заработало. Есть ли способ обойти это?
Мэтт
@Matt См. Drupal.stackexchange.com/a/222700/14151
Мэтт Флетчер
4

Я еще не работал в 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

Сумит Мадан
источник
Спасибо за ваш ответ. Но как я могу получить имя маршрута из текущего URL (потому что URL-адрес устанавливается с помощью формы конфигурации)
Anu Mathew
Вы имеете в виду путь перенаправления является динамическим ???
Сумит Мадан
Да, вы правы, его динамика ..
Ану Мэтью
Хорошо, попробуйте заменить \Drupal::url('route.name')ваш URL или, возможно, абсолютный URL.
Сумит Мадан
вернуть новый RedirectResponse ($ absolute_url); работает для меня :) Но на экране отображается сообщение "redirect to example.com/absolute_url "
Anu Mathew
4

Это может быть достигнуто путем использования встроенных симфоний EventDispatcher Component. Все, что вам нужно сделать, это создать собственный модуль. Добавьте ваш файл 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;
        }
Джей Чанд
источник
$ url не определен.
Дэн Шумейкер
1

Отлично работающий код перенаправления для меня заключается в следующем:

$response = new RedirectResponse($path);
return $response->send();

В любых других случаях я получаю какие-то исключения или ошибки, например: LogicException: контроллер должен вернуть ответ ...

ИЛИ

https://www.drupal.org/project/drupal/issues/2852657

Об этом уже идет дискуссия, надеюсь, это поможет!

Junkuncz
источник
0

это работает для внутреннего или внешнего перенаправления:

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
источник