亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Symfony 4 更改用戶區域設置?

如何使用 Symfony 4 更改用戶區域設置?

PHP
斯蒂芬大帝 2022-07-09 16:55:44
我正在嘗試使用 Symfony 從數據庫中的“區域設置”字段更改用戶區域設置。我閱讀了 Symfony 手冊(例如如何粘貼會話),但在我的應用程序中沒有任何作用。翻譯器仍然獲得默認語言環境...我創建了偵聽器、訂閱者...來動態更改語言環境,但是由于它們是在防火墻偵聽器之前加載的,因此我無法更改當前值。我試圖更改優先訂閱者,但我丟失了用戶實體。我試圖在控制器中設置語言環境請求,但我認為為時已晚。我不想在 URL 中添加語言環境。這是我的訂閱者 - 聽眾 - 代碼:public function onKernelRequest(RequestEvent $event){   $user = $this->tokenStorage->getToken()->getUser();   $request = $event->getRequest();   $request->setLocale($user->getLocale());}  在訂閱者中,我添加了:public static function getSubscribedEvents(){   return [     KernelEvents::REQUEST => [['onKernelRequest', 0]],   ];}在這里,我的完整代碼:框架.yml:default_locale: fr服務.yml:parameters:    locale: 'fr'    app_locales: fr|en|翻譯.yml:framework:    default_locale: '%locale%'    translator:        paths:            - '%kernel.project_dir%/translations'        fallbacks:            - '%locale%'LocaleSubscriber.php:namespace App\EventSubscriber;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpKernel\Event\RequestEvent;use Symfony\Component\HttpKernel\KernelEvents;class LocaleSubscriber implements EventSubscriberInterface{    private $defaultLocale;    public function __construct($defaultLocale = 'en')    {        $this->defaultLocale = $defaultLocale;    }    public function onKernelRequest(RequestEvent $event)    {        $request = $event->getRequest();        if (!$request->hasPreviousSession()) {            return;        }        // try to see if the locale has been set as a _locale routing parameter        if ($locale = $request->attributes->get('_locale')) {            $request->getSession()->set('_locale', $locale);        } else {            // if no explicit locale has been set on this request, use one from the session            $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));        }    }
查看完整描述

2 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

使用 查找防火墻偵聽器的優先級debug:event kernel.request。

確保您UserLocaleSubscriber在防火墻偵聽器之后立即執行。

自動裝配TranslatorInterface并手動設置翻譯器區域設置。

// src/EventSubscriber/UserLocaleSubscriber.php

namespace App\EventSubscriber;


use Symfony\Component\EventDispatcher\EventSubscriberInterface;

use Symfony\Component\HttpFoundation\Session\SessionInterface;

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

use Symfony\Component\Security\Http\SecurityEvents;

use Symfony\Contracts\Translation\TranslatorInterface;


/**

 * Stores the locale of the user in the session after the

 * login. This can be used by the LocaleSubscriber afterwards.

 */

class UserLocaleSubscriber implements EventSubscriberInterface

{

    private $session;


    private $translator;


    public function __construct(SessionInterface $session, TranslatorInterface $translator)

    {

        $this->session = $session;

        $this->translator = $translator;

    }


    public function onInteractiveLogin(InteractiveLoginEvent $event)

    {

        $user = $event->getAuthenticationToken()->getUser();


        if (null !== $user->getLocale()) {

            $this->translator->setLocale($user->getLocale());

        }

    }


    public static function getSubscribedEvents()

    {

        return [

            SecurityEvents::INTERACTIVE_LOGIN => ['onInteractiveLogin', 7]

        ];

    }

}


查看完整回答
反對 回復 2022-07-09
?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

如果沒有看到您正在使用的完整代碼,很難提供幫助。


Symfony 也有它自己的 LocaleListener。確保首先執行您的。


    /**

     * @return array

     */

    public static function getSubscribedEvents()

    {

        return [

            // must be registered before (i.e. with a higher priority than) the default Locale listener

            KernelEvents::REQUEST => [['onKernelRequest', 20]],

        ];

    }


查看完整回答
反對 回復 2022-07-09
  • 2 回答
  • 0 關注
  • 103 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號