登录语言环境 returns 后默认为 Symfony2

After Login locale returns to default Symfony2

几天来我一直在尝试在 symfony2 应用程序中向 url 添加语言环境前缀。一切正常,但是当我尝试登录时,应用程序将我重定向到默认语言,尽管我在登录前选择了另一种语言(例如:我在登录前选择英语 "en" in url 但登录后使用默认语言将我重定向到主页并从 url)

中删除 en

在 twig 中,我像这样更改语言:

 <li><a href="{{ path(app.request.get('_route'),app.request.get('_route_params')|merge({'_locale':'en'})) }}">EN</a></li>

我正在使用 JMSI18nRoutingBundle 并且我已输入 config.yml 此代码:

jms_i18n_routing:
default_locale: "%locale%"
locales: [de, en, it, fr]
strategy: prefix_except_default

我的 security.yml 看起来像这样。

security:
encoders:
    HotelPlanBundle\Entity\User: bcrypt

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_SUPER_ADMIN

providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            login_path: fos_user_security_login
            default_target_path: /checkrole
            check_path: fos_user_security_check
            use_referer: true
            csrf_provider: security.csrf.token_manager
        oauth:
            resource_owners:
                facebook:      "/login/check-facebook"
                google:        "/login/check-google"
                instagram:     "/login/check-instagram"
            login_path:        fos_user_security_login
            use_referer: true
            default_target_path: /extraregistration

            oauth_user_provider:
                service: app.fos_user.oauth_provider
        logout:
            path: fos_user_security_logout
        anonymous:    true

access_control:
    - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/connect/, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/administrator/, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: /administratordashboard, role: ROLE_SUPER_ADMIN }
    - { path: ^/homepage, role: ROLE_ADMIN }
    - { path: /listsinglevideo/, role: ROLE_SUPER_ADMIN }
    - { path: /upload, role: ROLE_ADMIN }
    - { path: ^/[^/]+/, role: IS_AUTHENTICATED_ANONYMOUSLY  }enter 

我也加了LocaleListener.php

   <?php

namespace HotelPlanBundle\Bundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;

    public function __construct($defaultLocale = 'de')
    {
        $this->defaultLocale = $defaultLocale;
    }

    public function onKernelRequest(GetResponseEvent $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));
        }
    }

    public static function getSubscribedEvents()
    {
        return array(
            // must be registered before the default Locale listener
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}

并在 services.yml

services:
    hotel.locale:
        class: HotelPlanBundle\EventListener\LocaleListener
        arguments: ["%kernel.default_locale%"]
        tags:
            - { name: kernel.event_subscriber }

我使用 FOSUSERbundle 进行登录和注册,使用 hwioauthbundle 进行 facebook 和 twitter 身份验证。当我使用 facebook 和 twitter 登录时,同样的事情发生在我身上。

有什么想法吗?

谢谢

感谢@R.CanserYanbakan 问题出在 security.ylm :default_target_path

firewalls:
main:
    pattern: ^/
    form_login:
        provider: fos_userbundle
        login_path: fos_user_security_login
        default_target_path: /checkrole

我在 default_target_path 中添加了正斜杠,它直接在路径中重定向,而不是在路径名称中,所以我们不得不像这样引用路径名称

firewalls:
main:
    pattern: ^/
    form_login:
        provider: fos_userbundle
        login_path: fos_user_security_login
        default_target_path: checkrole //this is also the name of the route in the controller