symfony2: как создать прослушиватель, который вызывается раньше любого другого прослушивателя?

#symfony #oauth #listener #http-redirect

#symfony #oauth #прослушиватель #http-перенаправление

Вопрос:

Я хотел бы выполнить перенаправление перед вызовом любого прослушивателя.

В частности, перед запуском oauthListener hwi.

Причина, по которой я хочу это сделать:

  • Я внедряю oauth в моей платформе symfony plateform / app
  • Мое приложение управляет несколькими «блогами» (многосайтовый стиль WordPress)
  • Я хочу, чтобы oauth (facebook, Google …) использовал одно приложение и не приходилось настраивать одно приложение каждый раз при создании нового «блога»
  • Возникшие проблемы:
    • URL перенаправления должен быть уникальным (даже если для Google вы можете задать несколько, я не хочу)
    • мои блоги иногда имеют псевдонимы => не всегда просматриваются в одном домене
    • проблемы с моими сеансами, поскольку они не могут быть разделены между несколькими доменами (sub yes, domains no)
  • Решение, которое я уже внедрил:
    • в моем запросе oauth я передаю общий домен для redirect_uri
    • Я использую параметр запроса состояния для хранения домена, из которого я был создан
  • Чего я хочу:
    • я хочу иметь ядро прослушивателя или другое, которое появляется раньше всего остального, чтобы проверить, установлен ли у меня этот параметр запроса состояния
    • Я хочу, чтобы это вызвало немедленное перенаправление текущего запроса на исходный домен, который я сохранил в параметре «state».

Я делаю это совершенно неправильно?
Если я хочу продолжить, знаете ли вы, как я должен объявить свой прослушиватель, чтобы он был первым И имел возможность запускать немедленное перенаправление?

Ответ №1:

kernel.request Событие является первым отправляемым событием.

Взгляните на список событий ядра.

Чтобы ваш конкретный прослушиватель выполнялся раньше других kernel.request прослушивателей, вы можете добавить priority параметр (диапазон: от -255 до 255, самый высокий выполняется первым) в конфигурацию службы вашего прослушивателя.

пример:

 services:
    kernel.listener.your_listener_name:
        class: AcmeDemoBundleEventListenerAcmeRequestListener
        tags:
            - name: kernel.event_listener
              event: kernel.request
              method: onKernelRequest
              priority: 255
  

Теперь все, что вам осталось, это выполнить перенаправление при определенных условиях внутри onKernelRequest() метода прослушивателя.

Я уверен, вы поймете, как это сделать. Полный пример кода выходит за рамки этого вопроса.

Дополнительные инструкции по написанию прослушивателя событий ядра можно найти в главе документация:

«Как создать прослушиватель событий»

Ответ №2:

Действительно, это было оно.

Я пробовал это несколько раз и думал, что это не сработало, но, вероятно, это была проблема очистки кэша.

Итак, для тех, кто хотел бы знать: я обрабатываю свои данные, чтобы создать перенаправляющий ответ (SymfonyComponentHttpFoundationRedirectResponse)

и в onKernelRequest я делаю

 public function onKernelRequest(GetResponseEvent $event){
    /**
      ... do stuff here
    */

    $event->setResponse($myResponse);
}