Язык по умолчанию Symfony без указания URL
Я хотел бы настроить Symfony locale
параметры, чтобы я мог успешно получить доступ к следующим маршрутам:
/route
/{locale}/route
В настоящее время я могу получить доступ /{locale}/route
и я понимаю, однако, /route
возвращает No route found for "GET /route"
, Моя конфигурация выглядит следующим образом:
#app/config/parameters.yml
parameters:
locale: en
#app/config/config.yml
parameters:
app_locales: en|fr
framework:
translator: { fallback: "%locale%" }
default_locale: "%locale%"
#app/config/routing.yml
app:
resource: '@AppBundle/Controller/'
type: annotation
Мой контроллер имеет следующие аннотации:
#src/AppBundle/Controller/Admin/MyController.php
/**
*
* @Route(
* "/{_locale}/admin/my",
* defaults={"_locale":"%locale%"},
* requirements={"_locale":"%app_locales%"}
* )
*/
class MyController extends Controller
{
/**
* @Route("/", name="admin_my_list")
* @Method("GET")
*/
public function listAction()
{
...
}
}
Если я специально включу locale
, все работает. Если я исключу locale
Я получаю No route found
ошибка.
2 ответа
Вы должны определить другой маршрут, чтобы охватить сценарий без предоставленной локали, попробуйте изменить определение маршрута на:
#src/AppBundle/Controller/Admin/MyController.php
class MyController extends Controller
{
/**
* @Route(
* "/admin/my",
* defaults={"_locale":"%locale%"},
* )
* @Route(
* "/{_locale}/admin/my",
* requirements={"_locale":"%app_locales%"}
* )
* @Method("GET")
*/
public function listAction()
{
...
}
}
Я согласен с тем, что Борис прокомментировал там.
Альтернативное решение о создании RouteMatcher состоит в том, чтобы использовать EventListener и перенаправить пользователя на тот же маршрут с локалью по умолчанию (проверьте ответ, который имеет больше голосов)
По моему мнению, делать это с помощью EventListeners, как объяснил Атлан, есть путь. Я бы не стал связываться с созданием собственного RouteMatcher. Просто посмотрите, что написал лордродос, никогда не пытался поместить два маршрута, подобных этому, в аннотации контроллера, но я думаю, что если у вас есть только один контроллер, это путь. Если их будет много, может быть намного чище сделать это с помощью EventListeners только в одном месте.