Symfony3 не может создавать переведенные маршруты с работающим маршрутизатором

Я пытаюсь встроить переключатель языка в основную навигацию, созданную с помощью KNPMenuBundle. Переводы выполняются с помощью JMSTranslationBundle. Оба работают нормально.

Я хочу создать переключатель языка с помощью конструктора меню, но генерация правильных маршрутов вызывает у меня некоторые головные боли.

Это мой сервис:

class MenuService
{
    private $factory;
    private $translator;
    private $router;

    public function __construct(FactoryInterface $factory, Translator $translator, Router $router)
    {
        $this->factory = $factory;
        $this->translator = $translator;
        $this->router = $router;
    }

    public function createMainMenu(RequestStack $requestStack, array $languages)
    {
        // Language Switcher - $languages === ['en', 'de']
        $request = $requestStack->getCurrentRequest();
        $routeName = $request->get('_route');

        $menu->addChild('menu.language', array(
            'uri' => '#',
            'label' => '<i class=\'fa fa-flag-checkered\'></i> '.$this->translator->trans('menu.language.main'),
            'extras' => array('safe_label' => true)
        ))
            ->setAttribute('class', 'dropdown singleDrop')
            ->setChildrenAttribute('class', 'dropdown-menu dropdown-menu-left')
        ;

        foreach ($languages as $language)
        {
            $menu->getChild('menu.language')->addChild('menu.language.'.$language, array(
                'route' => $this->router->generate($routeName, array_merge($request->get('_route_params'), ['_locale' => $language]))
            ));
        }
    }

И это мое определение службы

menu_builder:
    class: AppBundle\DependencyInjection\MenuService
    arguments: ['@knp_menu.factory', '@translator.default', '@jms_i18n_routing.router']

menu.main:
    class: Knp\Menu\MenuItem
    factory: ['@menu_builder', createMainMenu]
    arguments: ['@request_stack', '%locales%']
    scope: request
    tags:
      - { name: knp_menu.menu, alias: main }

Если я ввожу маршрутизатор, предоставленный JMSTranslationBundle, я получаю следующую ошибку:

Во время рендеринга шаблона возникло исключение ("Невозможно сгенерировать URL-адрес для именованного маршрута "/en/", поскольку такой маршрут не существует").

Если я использую маршрутизатор Symfony по умолчанию, я получаю это сообщение об ошибке:

Во время рендеринга шаблона возникло исключение («Невозможно сгенерировать URL-адрес для именованного маршрута «домашняя страница», поскольку такой маршрут не существует»).

Когда я отлаживаю маршрутизатор на консоли, это вывод:

  en__RG__homepage                                         ANY        ANY      ANY    /en/                                                 
  de__RG__homepage                                         ANY        ANY      ANY    /de/  

Какой маршрутизатор необходимо использовать, чтобы маршрутизация работала?


person KhorneHoly    schedule 02.06.2017    source источник
comment
откуда $routeName в 'route' => $this->router->generate($routeName, array_merge($request->get('_route_params'), ['_locale' => $language]))?   -  person lordrhodos    schedule 20.06.2017
comment
@lordrhodos Я отредактировал свой вопрос, я забыл эту часть, спасибо, что указали на это.   -  person KhorneHoly    schedule 20.06.2017
comment
Я думаю, вы должны использовать: JMS\I18nRoutingBundle\Router, см. github.com /schmittjoh/JMSI18nRoutingBundle/blob/master/Router/ Надеюсь, это поможет!   -  person Weenesta - Mathieu Dormeval    schedule 24.06.2017
comment
@MathieuDormeval спасибо за ваш ответ. Действительно, я должен использовать Router из JMS Routing Bundle, но это не решило проблему.   -  person KhorneHoly    schedule 26.06.2017


Ответы (1)


Я нашел свою ошибку с использованием этих двух пакетов.

Функция JMS\I18nRoutingBundle\Router::generate() вернет абсолютный путь для маршрута, указанного в функции.

Итак, происходит следующее:

$absolutePath = $this->router->generate('homepage', array_merge($request->get('_route_params'), ['_locale' => $language]));
dump($absolutePath); // Will return "/de/" or "/en" in my case

Итак, принимая это во внимание, моя генерация маршрутов с параметром route явно не удастся, потому что функция возвращает не route, а absolute path.

Учитывая это, это работает:

foreach ($languages as $language)
{
    $menu->getChild('menu.language')->addChild('menu.language.'.$language, array(
        'uri' => $this->router->generate($routeName, array_merge($request->get('_route_params'), ['_locale' => $language]))
    ));
}

Если я изменю route на uri, мой код будет работать правильно.

person KhorneHoly    schedule 26.06.2017