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'))
;
}
}
哪里出了问题?感谢您的帮助!
如果你使用autowire
到true
你不需要指定路由器服务。这样的东西应该足够了:
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')
;
我在 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'))
;
}
}
哪里出了问题?感谢您的帮助!
如果你使用autowire
到true
你不需要指定路由器服务。这样的东西应该足够了:
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')
;