2017-10-05 49 views
0

我创建了一个服务来扩展Sylius的管理中的菜单。它工作得很好;) I follow the official docSylius/Symfony 3在服务中注入服务

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

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')) 
     ; 
    } 
} 

有什么问题?谢谢你的帮助!

+0

在您的错误信息,你有 'XXMenuListener',这不符合您的监听器类的名字吗?我怀疑你在你的问题中编辑它?但无论如何,从删除缓存目录开始,将其作为可能的问题消除。 – Cerad

回答

1

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

例如:

的URI

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

路线

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

谢谢,是解决方案;) – darkiron

0

如果您使用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 } 

无论如何,你的错误表明你没有任何参数。可能是缓存问题,也可能是您没有自动导入为true并且没有参数的情况下为同一类XXX\Menu\AdminMenuListener提供另一个服务声明。

+0

autowire没有影响。争论也...我的堆栈整洁干净。只有一项服务。 – darkiron