Symfony игнорирует локаль пользователей после перенаправления входа в систему с помощью FosUserBundle - PullRequest
0 голосов
/ 08 января 2019

После того, как пользователь вошел в систему, я хочу, чтобы он был перенаправлен на заданный URL с языковым стандартом в качестве параметра /{_locale}/admin/schedule/list. Если я использую путь входа из FosUserBundles в качестве возвращаемого URL (без локали), то сайт будет переведен правильно.

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

security.yaml:

firewalls:
    main:
        pattern: ^/
        user_checker: security.user_checker
        form_login:
            provider: fos_userbundle
            csrf_token_generator: security.csrf.token_manager
            always_use_default_target_path: false
            default_target_path: scheduler_list

routes.yaml:

    scheduler_list: #If I use scheduler_list, it isn't working...
      path:
        en: /admin/{_locale}/list
        nl: /admin/{_locale}/lijst
      defaults: { _controller: App\Controller\ScheduleController:list }
      methods: [GET]

       some_page: #But 'some_page' is working because it doesn't contain 'user-locale'.
          path: /some-other-url-without-locale
          defaults: { _controller: App\Controller\SomeController:function }
          methods: [GET]

Я также добавил двух EventSubscribeers, LocaleSubscriber, чтобы сделать языковой стандарт «липким» во время сеанса пользователя, и UserLocaleSubscriber, чтобы получить языковой стандарт пользователя от пользователя после входа в систему.

LocaleSubscriber.php:

class LocaleSubscriber implements EventSubscriberInterface
{
    /** @var string */
    private $defaultLocale;

    /**
     * LocaleSubscriber constructor.
     * @param string $defaultLocale
     */
    public function __construct($defaultLocale = 'en')
    {
        $this->defaultLocale = $defaultLocale;
    }

    /**
     * @param GetResponseEvent $event
     */
    public function onKernelRequest(GetResponseEvent $event): void
    {
        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            return;
        }

        if ($locale = $request->attributes->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
        } else {
            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
        }
    }

    /**
     * @return array
     */
    public static function getSubscribedEvents(): array
    {
        return ['kernel.request' => [['onKernelRequest', 20]]];
    }
}

UserLocaleSubscriber.php:

class UserLocaleSubscriber implements EventSubscriberInterface
{
    /** @var SessionInterface */
    private $session;

    /**
     * UserLocaleSubscriber constructor.
     * @param SessionInterface $session
     */
    public function __construct(SessionInterface $session)
    {
        $this->session = $session;
    }

    /**
     * @param InteractiveLoginEvent $event
     */
    public function onInteractiveLogin(InteractiveLoginEvent $event): void
    {
        $user = $event->getAuthenticationToken()->getUser();
        if (null !== $user->getLocale()) {
            $this->session->set('_locale', $user->getLocale());
        }
    }

    /**
     * @return array
     */
    public static function getSubscribedEvents(): array
    {
        return ['security.interactive_login' => 'onInteractiveLogin'];
    }
}

Альтернатива: В качестве альтернативы я пытался работать с success_handler, но безуспешно:

security.yaml:

firewalls:
    main:
        pattern: ^/
        user_checker: security.user_checker
        form_login:
            provider: fos_userbundle
            csrf_token_generator: security.csrf.token_manager
            success_handler: App\EventSubscriber\RedirectLocaleHandler

App \ EventSubscriber \ RedirectLocaleHandler: onAuthenticationSuccess:

public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
    $user = $token->getUser();
    if ($user instanceof User) {
        return new RedirectResponse($this->router->generate('scheduler_list', ['_locale' => $user->getLocale()]));
    }
}

Почему-то $this->router->generate не может переопределить _locale, поэтому $user->getLocale() игнорируется и используется языковой стандарт по умолчанию.

Заранее спасибо за все предложения. Чтобы облегчить это, ссылка на исходный код проекта на Github .

...