Язык по умолчанию 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 только в одном месте.

Другие вопросы по тегам