登录语言环境 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
几天来我一直在尝试在 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