Язык запроса отличается: аргумент контроллера против RequestStack

#php #symfony #symfony4 #event-listener

#php #symfony #symfony4 #прослушиватель событий

Вопрос:

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

Вот пример одного из моих маршрутов: ‘website.com/nl ‘

 /**
 * Main page of the website
 * @Route("/{_locale}",
 *     name="home",
 *     defaults={"_locale": "nl"},
 *     requirements={
 *         "_locale": "nl|en|fr"
 *     },
 * )
 * @param Request $request
 * @param $_locale
 * @return SymfonyComponentHttpFoundationResponse
 */
public function home(
    Request $request,
    $_locale
) {
    // $_locale === "nl"
    // $request->getLocale() === "nl"
}
  

Как и ожидалось на основе URL, локаль — NL

Теперь, когда мне нужна локаль в одной из моих служб или прослушивателей событий, мне нужно использовать RequestStack->getCurrentRequest()->getLocale() . Однако для этого языка всегда задается значение locale: «en»

Сопоставление служб:

 app.doctrine.locale_listener:
    class: AppEventListenerLocaleListener
    public: false
    arguments: ["@request_stack"]
    lazy: true
    tags:
      - { name: "doctrine.orm.entity_listener", entity: AppEntityTranslationTranslatable, event: postLoad }
  

Прослушиватель объектов:

 namespace AppEventListener;

use AppEntityTranslationTranslatable;
use DoctrineORMEventLifecycleEventArgs;
use SymfonyComponentHttpFoundationRequestStack;

class LocaleListener
{
    private $currentLocale;
    public function __construct(RequestStack $rs)
    {
        $this->currentLocale = $rs->getCurrentRequest()->getLocale();
        // $this->currentLocale === "en"
    }

    public function postLoad(Translatable $translatable, LifecycleEventArgs $args)
    {
        $translatable->setLocale($this->currentLocale);
        // e.g. url: mywebsite.be/nl
        // Why is $this->currentLocale === "en"?
    }
}
  

Что я делаю не так?

Комментарии:

1. Возможно, потому, что экземпляр прослушивателя создается до обработки самого запроса. Просто сохраните стек запросов в конструкторе, затем выполните getCurrentRequest в методе postLoad и посмотрите, поможет ли это.

2. Эй, @Cerad, ты абсолютно прав, это работает! Возможно, я проигнорировал документы о создании пользовательского прослушивателя для изменения локали перед инициализацией моих собственных слушателей: / Возможно, вы захотите опубликовать это в качестве своего ответа, чтобы я мог его принять