Так у меня есть это в контроллере: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
Кто-нибудь знает, почему это происходит?