Рейтинг:2

В подписчике событий, как перенаправить, если значение не существует?

флаг zw

Я пытаюсь проверить условие перед загрузкой страницы, если существует значение для загрузки страницы, если не для перенаправления.

я слежу за этим страница

Я создал файл /mymodule/mymodule.services.yml и файл /mymodule/src/MyModuleSubscriber.php.

В MyModuleSubscriber.php я хотел бы проверить, существует ли значение, если оно загружает сайт как обычно, если значение не существует для выполнения перенаправления.

Это код, но не уверен, как его правильно написать. Мне нужно поставить оператор else или просто оставить пустым?

Это правильный способ проверить, существует ли значение при каждой загрузке страницы?

класс MyModuleSubscriber реализует EventSubscriberInterface {

      общедоступная функция checkForRedirect (GetResponseEvent $event) {

          $baseUrl = $event->getRequest()->getBaseUrl();

          если ($ значение == ноль &&
             $baseURL !== '/MyModulePage') {
              $event->setResponse(новый RedirectResponse($baseUrl.'/MyModulePage'));
          }
      }


  /**
   * {@inheritdoc}
   */
  статическая функция getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('MyModuleLoad', 200);
    вернуть $события;
  }
}

Редактировать:

      $path = \Drupal::service('path.current')->getPath();

      если($путь !== '/MyModulePage') {
          $event->setResponse(новый RedirectResponse('/MyModulePage'));
      }
May  avatar
флаг zw
Изменить: обновлен код. Что должно произойти, если посетитель не попадает на /MyModulePage, чтобы перенаправить его на /MyModulePage. Но ничего не происходит.
4uk4 avatar
флаг cn
Служба `path.current` обновляется во время маршрутизации, поэтому вам нужно получить путь из `$event->getRequest()->getPathInfo()`.
May  avatar
флаг zw
Привет, все еще не работает. Я думаю, что это проблема кэширования? Иногда работает, иногда нет. Нужно ли вместо этого запускать промежуточное программное обеспечение или я могу просто обновить код. В основном мне нужно, чтобы оператор if проверялся при каждой загрузке страницы. Спасибо
4uk4 avatar
флаг cn
Мой ответ объясняет, как Drupal кэширует перенаправления. Если вы настаиваете на том, чтобы ваш код выполнялся при каждой загрузке страницы, что практически означает, что вы вообще не хотите кешировать перенаправление, то, во-первых, вам нужно позаботиться о кешировании браузера, они довольно агрессивно кешируют перенаправления, а во-вторых, вам нужно отключить внутренний кэш страниц. См. [комментарий] (https://drupal.stackexchange.com/questions/278698/disabling-page-cache-for-redirect-response/278703#comment346356_278698) в теме, ссылку на которую я дал в конце ответа.
Рейтинг:4
флаг cn

Да, это правильный подход. Вам не нужен оператор else. Если вы не задаете ответ, распространение события не останавливается, и подписчики событий с более низким приоритетом получают возможность задать ответ. Приоритет зависит от $value. В вашем вопросе неясно, но если это не зависит ни от чего конкретного Drupal, установите приоритет> 300.

Лучшей практикой является использование кешируемого ответа и добавление любых зависимостей $value к ответу. Если у вас их нет, все равно используйте этот ответ. Это говорит Drupal, что вы согласны с тем, что он кэшируется, как вы хотите перенаправить этот путь.

Пример:

core/lib/Drupal/Core/EventSubscriber/RedirectLeadingSlashesSubscriber.php

<?php

пространство имен Drupal\Core\EventSubscriber;

используйте Drupal\Core\Cache\CacheableRedirectResponse;
используйте Symfony\Component\HttpKernel\Event\RequestEvent;
используйте Symfony\Component\HttpKernel\KernelEvents;
используйте Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Перенаправляет пути, начинающиеся с нескольких косых черт, на одну косую черту.
 */
class RedirectLeadingSlashesSubscriber реализует EventSubscriberInterface {

  /**
   * Перенаправляет пути, начинающиеся с нескольких косых черт, на одну косую черту.
   *
   * @param\Symfony\Component\HttpKernel\Event\RequestEvent $event
   * RequestEvent для обработки.
   */
  перенаправление публичной функции (RequestEvent $event) {
    $запрос = $event->getRequest();
    // Получить запрошенный путь минус базовый путь.
    $path = $request->getPathInfo();

    // Невозможно создать ссылку или маршрут к пути, начинающемуся с
    // несколько ведущих косых черт. Однако, если на страницу 404 добавлена ​​форма, которая
    // отправляет обратно на тот же URI, что представляет собой открытое перенаправление
    // уязвимость. Кроме того, Drupal 7 отображает одну и ту же страницу для
    // http://www.example.org/foo и http://www.example.org////foo.
    если (strpos($path, '//') === 0) {
      $путь = '/' . ltrim($путь, '/');
      $qs = $request->getQueryString();
      если ($qs) {
        $qs = '?' . $ кв;
      }
      $event->setResponse(new CacheableRedirectResponse($request->getUriForPath($path). $qs));
    }
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = ['redirect', 1000];
    вернуть $события;
  }

}

Если $value специфично для Drupal, например, вы получаете его от сущности, используйте приоритет по умолчанию 0 и установите сущность как зависимость кэша. В этом случае вам нужно установить заголовки ответа, чтобы браузер не кэшировал результат перенаправления для этого пути. Использовать LocalRedirectResponse для местных или TrustedRedirectResponse для внешних URL. Смотрите этот отличный ответ Отключение кеша страницы для ответа на перенаправление

May  avatar
флаг zw
Привет @ 4k4 Я обновил свой пост. Что должно произойти, если посетитель не попадает на MyModulePage, чтобы быть перенаправленным на MyModulePage.Однако ничего не происходит. Спасибо

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.