How can I add the _locale parameter to security paths?
I managed to solve the problem like this
access_control: ... - { path: ^/(en|fr|es|de)/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }
A recommendation for other answerers: I now have to enter this string (en|fr|de)
into all routes manually. When I add a language I have to modifiy this string in many occurences. It would be much better if one could define a string
parameters: languages: "(en|fr|es|de)"
And use this in the route
- { path: ^/%languages%/privacy$, role: IS_AUTHENTICATED_ANONYMOUSLY }
But I don't think this will work.
If all your locales are 2-character ones (en|fr|es|de|...
) you can use a more generic regex like this:
- { path: '^/[a-z]{2}/privacy$', role: 'IS_AUTHENTICATED_ANONYMOUSLY' }
This way you won't have to touch your security.access_control
every time you add a new locale.
For locales in the form EN_en
you could use something like this btw:
- { path: '^/[a-zA-Z]{2}_[a-zA-Z]{2}/privacy$', role: 'IS_AUTHENTICATED_ANONYMOUSLY' }
Nowadays (since Symfony 4.1 or later) you can define the locales in one place and use it everywhere in your application
in config/services.yaml
add
parameters: myAppName.locales: en|fr|es|de
in config/routes.yaml
cms: prefix: /{_locale}/ controller: App\Controller\DefaultController::index requirements: _locale: '%myAppName.locales%'
in config/packages/security.yaml
security: ## .... no changes here access_control: - { path: ^/(%myAppName.locales%)/cms, roles: ROLE_ADMIN }