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


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.