私は奇妙な問題に遭遇しました。
Doctrine 2.2 とユーザー管理用の FOSUserBundle を使用して Symfony 2.1 プロジェクトに取り組んでいます。
ユーザーはサイトの言語を変更でき、ユーザーが最後に使用した言語を追跡したいので、RequestListener を追加しました。
したがって、ユーザーエンティティに新しいプロパティを追加しただけで、変更された場合は新しい言語を保存したいと考えています。
だから私はリクエストリスナーでこれをやっています:
public function onKernelRequest(GetResponseEvent $event)
{
if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
return;
}
if ($event->getRequest()->getRequestFormat() !== 'html') {
return;
}
if ($this->context->getToken()->getUser() instanceof \Foo\BarBundle\Entity\User) {
$this->request = $event->getRequest();
$this->user = $this->context->getToken()->getUser();
if ($this->user->getCustomer() instanceof \Foo\BarBundle\Entity\Customer) {
$this->customer = $this->user->getCustomer();
$permission = $this->permissionService->getPermissionSafely($this->customer);
$params = $this->request->get('_route_params');
$language = $this->getLanguage($permission['language']['languages']);
$locale = (strtolower($this->request->get('_locale')) === 'de') ? 'de_DE' : 'en_US';
if ($language !== "all" && $this->request->get('_locale') !== $language) {
$params['_locale'] = $language;
$redirect = new RedirectResponse($this->router->generate($this->request->get('_route'), $params));
$event->setResponse($redirect);
}
if ($this->user->getLastLanguage() !== $locale) {
$this->user->setLastLanguage($locale);
$this->em->flush();
}
}
}
}
private function getLanguage($language)
{
if (!isset($language['en'])) {
return 'de';
}
if (!isset($language['de'])) {
return 'en';
}
if ($language['en'] && !($language['de'])) {
return 'en';
} else if (!$language['en'] && $language['de']) {
return 'de';
}
return 'all';
}
重要なのは最後のif
条件です。現在の$locale
ものが最後に使用されたものと異なる場合は、ユーザー オブジェクトを更新したいと考えています。したがって、可能な値de_DE
は 、 、en_US
およびの 3 つnull
です。
今、奇妙な動作が発生します(バグなのか何なのかわかりませんが、混乱しています):
データベースに格納されている値は問題ではなく、常に に更新されen_US
ます。
ユーザーが初めてページにアクセスし (値null
)、ドイツ語でサイトにアクセスした場合 (値de_DE
) に更新されen_US
ますが、プロファイラーのクエリは次のように述べています。
UPDATE `user` SET last_language = 'de_DE' WHERE id = 1
ユーザーがドイツ語 ( )last_language = 'de_DE'
のサイトを持っていて訪問すると、 に更新されますが、クエリ プロファイラーは更新クエリがなかったと言っています。は と同じなので、これは理にかなっています。de_DE
en_US
$locale
$this->user->getLastLanguage()
なに??
ここで何が起こっているのかわかりません。誰かが同様の問題を経験しましたか? これは、セキュリティ コンテキストからユーザー オブジェクトを変更しているという事実と関係がありますか?
更新:面白いことに、行を変更すると
$locale = (strtolower($this->request->get('_locale')) === 'de') ? 'de_DE' : 'en_US';
に
$locale = (strtolower($this->request->get('_locale')) === 'de') ? 'de_DE' : 'es_US';
保持されているes_US
場合はイベントに更新されます$locale
de_DE