Пользователь Symfony придерживается локали - PullRequest
0 голосов
/ 23 октября 2018

В последние два дня я пытался сделать своего заказного 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 }

Есть идеи, почему не работает?Кто-то сталкивался с такой же проблемой?Есть примеры?

...