В последние два дня я пытался сделать своего заказного LocaleSubscriber
, абонента, который должен установить языковой стандарт пользователя в соответствии с предпочтениями пользователя или по умолчанию.
<?php
namespace App\Event\Subscriber;
use App\Entity\Language;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
/**
* Class LocaleSubscriber
* @package App\Event\Subscriber
*/
class LocaleSubscriber
{
/** @var EntityManagerInterface */
private $entityManager;
/** @var SessionInterface */
private $session;
/**
* LocaleSubscriber constructor.
*
* @param EntityManagerInterface $entityManager
* @param SessionInterface $session
*/
public function __construct(EntityManagerInterface $entityManager, SessionInterface $session)
{
$this->entityManager = $entityManager;
$this->session = $session;
}
/** {@inheritdoc} */
public function onInteractiveLogin(InteractiveLoginEvent $event)
{
$request = $event->getRequest();
$user = $event->getAuthenticationToken()->getUser();
if (null !== $user->getLocale()) {
$this->session->set('_locale', $user->getLocale());
$request->setLocale($user->getLocale());
} else {
/** @var Language $language */
$language = $this->entityManager->getRepository(Language::class)->findOneBy(['defaultLang' => true]);
$language = $language->getSlug();
$this->session->set('_locale', $language);
$request->setLocale($language);
}
}
}
Я пытаюсь сделать эту систему, потому что все языки перечислены в моей базе данных (язык - одна из моих сущностей), и я хочу сделать это приложение простым в обслуживании и расширении для нетехнических пользователей.
Проблема в том, что после выхода из этого метода языковой стандарт запроса возвращается к en
, а новый языковой стандарт сохраняется только в сеансе.
Я поместил в конец функции dump($request, $this->session->all())
, и оба языка имеют один и тот же язык.Кроме того, приоритет в services.yaml
установлен на 15.
App\Event\Subscriber\LocaleSubscriber:
tags:
- { name: kernel.event_listener, event: security.interactive_login, method: onInteractiveLogin, priority: 15 }
Есть идеи, почему не работает?Кто-то сталкивался с такой же проблемой?Есть примеры?