2017-01-24 8 views
0

Так у меня есть это в контроллере:Symfony охранник с локаль не работает

/** 
* @Route("/", name="home", defaults={"_locale": "%locale%"}) 
* @Route("/{_locale}", name="home_locale", defaults={"_locale": "%locale%"}, requirements={"_locale": "\w{2,3}"}) 
* 
* @param Request $request 
* 
* @return Response 
*/ 
public function indexAction(Request $request) 
{ 
    return $this->render('@Base/Default/index.html.twig'); 
} 

/** 
* @Route("/{_locale}/welcome", name="welcome", defaults={"_locale": "%locale%"}, requirements={"_locale": "\w{2,3}"}) 
* 
* @param Request $request 
* 
* @return RedirectResponse|Response 
*/ 
public function loginAction(Request $request) 
{ 
    $loggedUser = $this->getUser(); 

    $locale = $request->getLocale(); 

    if ($loggedUser instanceof User) { 
     return $this->redirect($this->generateUrl('home', ['_locale' => $locale])); 
    } 

    $error = $this->get('security.authentication_utils')->getLastAuthenticationError(); 

    $loginForm = $this->createForm(LoginType::class, null, ['action' => $this->generateUrl('welcome', ['_locale' => $locale]), 'method' => 'POST']); 

    $user = new User(); 
    $registrationForm = $this->createForm(UserRegistrationType::class, $user, ['action' => $this->generateUrl('register'), 'method' => 'POST']); 

    return $this->render(
     '@Base/Default/login.html.twig', 
     [ 
      'error' => $error, 
      'loginForm' => $loginForm->createView(), 
      'registerForm' => $registrationForm->createView() 
     ] 
    ); 
} 

и это в безопасности:

encoders: 
    BaseBundle\Entity\User: bcrypt 

# http://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded 
providers: 
    database_users: 
     entity: { class: BaseBundle:User, property: username } 

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 

    main: 
     pattern: ^/ 
     anonymous: ~ 
     guard: 
      authenticators: 
       - base.security.login_form_authenticator 
     logout: 
      path: /logout 

access_control: 
    - { path: ^/%locales%/welcome, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/%locales%/register$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/*, roles: ROLE_USER } 

в параметрах локалей, как это:

locale: ro 
locales: ro|en 

в функции защиты для перенаправления:

/** 
* @return mixed 
*/ 
protected function getLoginUrl() 
{ 
    /** @var RequestContext $locale */ 
    $requestContext = $this->router->getContext(); 

    $locale = $requestContext->getParameter('_locale'); 

    return $this->router->generate('welcome', ['_locale' => $locale]); 
} 

/** 
* @return mixed 
*/ 
protected function getDefaultSuccessRedirectUrl() 
{ 
    /** @var RequestContext $locale */ 
    $requestContext = $this->router->getContext(); 

    $locale = $requestContext->getParameter('_locale'); 

    return $this->router->generate('home', ['_locale' => $locale]); 
} 

Сценарий следующий, на левой будет путь и право, что происходит:

/  -> i am redirected to /ro/welcome witch is correct 

/en -> i am redirected to /en/welcome witch is also correct 

/ro/welcome -> is working 

/en/welcome -> is working 

/ro -> i am NOT redirected to /ro/welcome witch is NOT good 

После того как я войти в систему вместо того, чтобы локаль ро я перенаправлены ен, а также при попытке доступа/en/welcome logged Я перенаправлен в /? _ locale = en (который показывает ro-перевод, поэтому не работает) вместо/en

Кто-нибудь знает, почему это происходит?

ответ

0

Я нашел проблему, в безопасности, а не path: ^/%locales%/welcome. Поперечный путь: path: ^/(%locales%)/welcome

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