2017-01-16 9 views
5

Проблема У меня есть, когда пользователь меняет язык на странице входа - он работает, но после входа в систему пользователя он снова возвращается к умолчанию. Как сделать возможным сохранение того же языка, который был выбран пользователем перед входом в систему, остаться после входа в систему? Я пробовал посмотреть это на stackoverflow, но не смог найти рабочий результат.Symfony3 Сохранение языкового стандарта после входа в систему

security.yml:

security: 

    encoders: 
     AppBundle\Entity\User: 
      algorithm: bcrypt 

    role_hierarchy: 
     ROLE_ADMIN: ROLE_PREMIUM 
     ROLE_PREMIUM: ROLE_USER 

    providers: 
     our_db_provider: 
      entity: 
       class: AppBundle:User 
       property: email 

     in_memory: 
      memory: ~ 

    firewalls: 
     # disables authentication for assets and the profiler, adapt it according to your needs 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

     main: 
      anonymous: ~ 

      form_login: 
       #galima nurodyti kur nukreipia loginas 
       login_path: login 
       check_path: login 
       csrf_token_generator: security.csrf.token_manager 
      logout: 
       path: /logout 

      pattern: ^/ 
      http_basic: ~ 
      provider: our_db_provider 
      access_denied_url: homepage 

routing.yml

app: 
    resource: "@AppBundle/Controller/" 
    type:  annotation 
    prefix: /{_locale} 
    requirements: 
     _locale: lt|en|ru 

root: 
    path:/
    defaults: 
     _controller: FrameworkBundle:Redirect:urlRedirect 
     path: /%locale%/ 
     permanent: true 

login: 
    path: /{_locale}/login 
    defaults: { _controller: AppBundle:Security:login } 
    requirements: 
     _method: GET 
     _locale: lt|en|ru 

logout: 
    path: /logout 
    defaults: 
     _controller: FrameworkBundle:Redirect:urlRedirect 
     path: /{_locale}/login 
     permanent: true   

register: 
    path: /{_locale}/register 
    defaults: { _controller: AppBundle:Registration:register } 
    requirements: 
     _method: GET 
     _locale: lt|en|ru     

Язык изменен:

<ul class="top-menu-list top-menu-languages"> 
    <li><a href="{{ path(app.request.attributes.get('_route'), app.request.query.all|merge({'_locale': 'lt'})) }}">LT</a></li> 
    <li><a href="{{ path(app.request.attributes.get('_route'), app.request.query.all|merge({'_locale': 'en'})) }}">EN</a></li> 
    <li><a href="{{ path(app.request.attributes.get('_route'), app.request.query.all|merge({'_locale': 'ru'})) }}">RU</a></li> 
</ul> 

Любые идеи или е xamples были бы оценены!

+0

Использование входа пользователя слушателя и перенаправлять на реферер: http://stackoverflow.com/questions/11180351/symfony2-after-successful-login-event-perform-set-of- действия – COil

+0

Весь пример устарел давно ... – JustinasT

+0

http://symfony.com/doc/current/components/security/authentication.html#authentication-events – COil

ответ

3

По умолчанию компонента Security сохраняет информацию о последнем запросе URI (например /en/admin) в переменном сеансе с именем _security.main.target_pathmain является именем брандмауэра, определенным в security.yml). После успешного входа в систему пользователь перенаправляется на этот путь, чтобы помочь им продолжить работу с последней известной страницы, которую они посетили.

Note: No matter how many times the language is changed on the login page, because the firewall always redirect to /en/admin/ after success login, so the locale changes again to en .

Чтобы исправить это вам может понадобиться change the default Target Path Behavior:

за исключением Приёмника Класс:

// src/AppBundle/Security/Firewall/ExceptionListener.php 

use Symfony\Component\Security\Http\Firewall\ExceptionListener as BaseExceptionListener; 

class ExceptionListener extends BaseExceptionListener 
{ 
    use TargetPathTrait; 

    protected function setTargetPath(Request $request) 
    { 
     if ($request->hasSession() && $request->isMethodSafe(false) && !$request->isXmlHttpRequest()) { 
      $this->saveTargetPath(
       $request->getSession(), 
       // the firewall name 
       'admin', 
       // save the route name instead of the URI 
       $request->attributes->get('_route') 
      ); 
     } 
    } 
} 

Это генерировать старый маршрут после входа в систему с текущей локали.

Конфигурация:

Для Symfony 2:

# app/config/services.yml 
parameters: 
    # ... 
    security.exception_listener.class: AppBundle\Security\Firewall\ExceptionListener 

Для Symfony 3:

Вы, возможно, потребуется создать компилятор пасс и изменить этот класс вручную:

// src/AppBundle/DependencyInjection/Compiler/ExceptionListenerPass.php; 

class ExceptionListenerPass implements CompilerPassInterface 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function process(ContainerBuilder $container) 
    { 
     $definition = $container->getDefinition('security.exception_listener.admin'); 
     $definition->setClass('AppBundle\Security\Firewall\ExceptionListener'); 
    } 
} 

Наконец, зарегистрируйте компилятор передать в вашем пачке:

// src/AppBundle/AppBundle.php 

class AppBundle extends Bundle 
{ 
    public function build(ContainerBuilder $container) 
    { 
     $container->addCompilerPass(new ExceptionListenerPass()); 
    } 
} 
+0

Ваше решение перенаправляет пользователя на заданную страницу. Мне нужно иметь возможность перенаправлять пользователя. к которому он стремился получить доступ до входа в систему. Например, я пытаюсь получить доступ к веб-сайту website.com/en/about - я перенаправляюсь на экран входа в систему. на экране входа в систему, я меняю язык на ru, и после входа в систему я должен быть перенаправлен на website.com/ru/about – JustinasT

+0

Если вы используете Symfony2, вторая часть - это решение, которое вы ищете. – yceruto

+0

Я обновил свой ответ с помощью более простого решения для Symfony3 :) – yceruto

 Смежные вопросы

  • Нет связанных вопросов^_^