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


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

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

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

Author: kiamlaluno, 2014-12-03

6 answers

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

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path);
  $response->send();
  return;
}
 29
Author: Anu Mathew, 2019-07-10 00:54:03

Чтобы развить ответ Ану Мэтью;

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

use Symfony\Component\HttpFoundation\RedirectResponse;

function my_goto($path) { 
  $response = new RedirectResponse($path, 302);
  $response->send();
  return;
}
 9
Author: Christian, 2017-04-13 12:46:58

Этого можно достичь, используя встроенный компонент 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']]];
  }
}
 6
Author: Jay Chand, 2020-09-29 06:27:38

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

 4
Author: Sumit Madan, 2017-05-30 13:10:40

Идеально работающий код перенаправления для меня выглядит следующим образом:

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

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

ИЛИ

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

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

 2
Author: Junkuncz, 2019-03-01 18:42:45

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

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();
 1
Author: Matoeil, 2019-05-23 07:23:15