Яку функцію / метод можна використовувати для перенаправлення користувачів на іншу сторінку?


12

У 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
Для мене це здається, що спрацює лише один раз, і потрібно кешувати очищення кожного разу, коли ви хочете, щоб він знову працював. Чи є шлях до цього?
— Метт


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 ($ absolut_url); працює для мене :) Але його показ "перенаправлення на example.com/absolute_url " на екрані
— Anu Mathew

4

Цього можна досягти, використовуючи вбудовані симфонії Компонент 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;
        }

$ url не визначено.
— Ден Шумкер

1

Для мене ідеально працює код переадресації:

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

У будь-яких інших випадках я отримую якісь винятки або помилки, наприклад: LogicException: Контролер повинен повернути відповідь ...

АБО

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

Про це вже йде дискусія, сподіваюся, що це допомагає!


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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.