Циклическая переадресация

Главные вкладки

Аватар пользователя leha373 leha373 14 ноября 2022 в 20:23

Всем привет. Давно не обращался, но сам выяснить не смог. Устаноил чистый друпал и пытаюсь написать событие переадресации при загрузке. Вот код:
BootAccesFlag.php

namespace Drupal\custom_mod;

use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Core\Url;
use Symfony\Component\HttpKernel\Event\RequestEvent;

/**
 * Provides a MyModuleSubscriber.
 */

class BootAccesFlag implements EventSubscriberInterface {

  /**
   * // only if KernelEvents::REQUEST !!!
   * @see Symfony\Component\HttpKernel\KernelEvents for details
   *
   * @param Symfony\Component\HttpKernel\Event\GetResponseEvent $event
   *   The Event to process.
   */

  public function MyModuleLoad(GetResponseEvent $event) {
    // @todo remove this debug code
        if (Условие) {
      $url = Url::fromRoute('node.add_page')->toString();
      $response = new RedirectResponse($url, 301);
      $event->setResponse($response);

          }
}

  /**
   * {@inheritdoc}
   */

  static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('MyModuleLoad', 250);
    return $events;
  }
}

Но идет циклическая переадресация на /node/add и выдается ошибка "слишком много переадресаций"
Так же пробовал и Middleware API
Пробовал и в форме и везде.
И писал и return; и exit;
Голову уже сломал, кто может сталкивался и есть ли решение?
Голову сломал уже в чем проблема!
Друпал 8,9
Заранее спасибо

Лучший ответ

Аватар пользователя gun_dose gun_dose 15 ноября 2022 в 19:52

Да, она срабатывает один раз за запрос. Юзера перекидывает на другой или тот же самый адрес и начинается новый запрос. А поскольку он новый, то переадресация срабатывает снова.

Комментарии

Аватар пользователя gun_dose gun_dose 15 ноября 2022 в 19:16

Так у вас нет никакого условия. То есть переадресация происходит в любом случае. Поэтому она и циклическая.

Аватар пользователя leha373 leha373 15 ноября 2022 в 19:24

Ну по сути подписчик срабатыает только один раз при загрузке и должна быть одна переадрисация.
"Условие" я написал для примера
например если я напишу в услвие if ( \Drupal::currentUser()->id() == 2), то на этом пользователи будет циклическая переадресация

Аватар пользователя gun_dose gun_dose 15 ноября 2022 в 19:52

Да, она срабатывает один раз за запрос. Юзера перекидывает на другой или тот же самый адрес и начинается новый запрос. А поскольку он новый, то переадресация срабатывает снова.

Аватар пользователя leha373 leha373 15 ноября 2022 в 21:08

ААААА, понял теперь! А как же мне сделать, чтобы перекинуло на адрес и остановилось? Надо как то исключить страницу(роутер) на которую перекинуло. Или есть какой то другой вариант? если пишу exit; то страница не отрисовывается, return; - так же циклическая переадресация

Аватар пользователя leha373 leha373 15 ноября 2022 в 21:19

Ну да надо исключить страницу, других вариантов не вижу. Спасибо тебе, что навел на решение. Вопрос закрыт!