Sylius/Symfony3 在服务中注入服务

Sylius/Symfony 3 inject service in a service

我在 Sylius 的管理员中创建了一个扩展菜单的服务。它工作得很好 ;) I follow the official doc

我尝试注入路由器服务,但出现以下错误:

Type error: Too few arguments to function XXMenuListener::__construct(), 0 passed in appDevDebugProjectContainer.php on line 1542 and exactly 1 expected

此服务的声明:

services:
    app.listener.admin.menu_builder:
        class: XXX\Menu\AdminMenuListener
        autowire: true
        arguments:
            - '@router'
        tags:
            - { name: kernel.event_listener, event: sylius.menu.admin.main, method: addAdminMenuItems }

和服务本身:

<?php

namespace XXX\Menu;

use Sylius\Bundle\UiBundle\Menu\Event\MenuBuilderEvent;
use Symfony\Bundle\FrameworkBundle\Routing\Router;

final class AdminMenuListener
{

    private $router;

    public function __construct(Router $router){
        $this->router = $router;
    }


    /**
     * @param MenuBuilderEvent $event

     */
    public function addAdminMenuItems(MenuBuilderEvent $event){
        $menu = $event->getMenu();

        $newSubmenu = $menu
            ->addChild('new')
            ->setLabel('XXX')
        ;

        $newSubmenu
            ->addChild('new-subitem')
            ->setLabel('XXX')
            //->setUri('https://www.google.com');
            ->setUri($this->router->generate('foo'))
        ;
    }
}

哪里出了问题?感谢您的帮助!

如果你使用autowiretrue你不需要指定路由器服务。这样的东西应该足够了:

services:
    app.listener.admin.menu_builder:
        class: XXX\Menu\AdminMenuListener
        autowire: true
        tags:
            - { name: kernel.event_listener, event: sylius.menu.admin.main, method: addAdminMenuItems }

无论如何,您的错误表明您没有任何参数。可能是缓存问题,或者您可能有另一个针对相同 class XXX\Menu\AdminMenuListener 的服务声明,但没有自动连接到 true 且没有参数。

如果手动清理缓存目录没有帮助,我认为您需要清除缓存。 无论如何,您不需要路由器服务,因为 menubuilder 已经有了它。

例如:

对于 uri

$newSubmenu
   ->addChild('new-subitem')
   ->setLabel('XXX')
   ->setUri('https://www.google.com')
;

路线

$newSubmenu
   ->addChild('new-subitem', ['route' => 'foo'])
   ->setLabel('XXX')
;