#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, ты абсолютно прав, это работает! Возможно, я проигнорировал документы о создании пользовательского прослушивателя для изменения локали перед инициализацией моих собственных слушателей: / Возможно, вы захотите опубликовать это в качестве своего ответа, чтобы я мог его принять