Symfony3无法使用路由器在服务中创建已转换的路由

Kho*_*oly 6 php routing symfony php-7.1 symfony-3.2

我正在尝试在我的主导航中构建一个语言切换器,这是由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]))
            ));
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的服务定义

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 }
Run Code Online (Sandbox Code Playgroud)

如果我注入JMSTranslationBundle提供的路由器,我收到以下错误:

在呈现模板期间抛出异常("无法生成指定路由的URL"/ en /"因为此类路由不存在.").

如果我使用symfony的默认路由器,我收到此错误消息:

在呈现模板期间抛出异常("无法生成指定路径的URL"主页"因为此类路由不存在.").

当我在控制台上调试路由器时,这是输出:

  en__RG__homepage                                         ANY        ANY      ANY    /en/                                                 
  de__RG__homepage                                         ANY        ANY      ANY    /de/  
Run Code Online (Sandbox Code Playgroud)

必须使用哪个路由器才能使路由正常工作?

Kho*_*oly 0

我发现我在使用这两个包时犯了错误。

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
Run Code Online (Sandbox Code Playgroud)

因此,考虑到这一点,我使用参数生成路由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]))
    ));
}
Run Code Online (Sandbox Code Playgroud)

如果我更改routeuri我的代码可以正常工作。