我看过很多关于此事的帖子,但我不明白我做错了什么。
services.yml:
parameters:
services:
bar.menu_builder:
class: Foo\BarBundle\Menu\MenuBuilder
arguments: [ @security.context ]
使用MenuBuilder:
namespace Foo\BarBundle\Menu;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Knp\Menu\FactoryInterface;
class MenuBuilder {
protected $securityContext;
protected $isLoggedIn;
public function __construct(SecurityContextInterface $securityContext) {
$this->securityContext = $securityContext;
$this->isLoggedIn = $this->securityContext->isGranted('IS_AUTHENTICATED_FULLY');
}
// other methods
}
但是没有传递SecurityContext,因为我得到了这个异常:
ContextErrorException :Catchable Fatal Error:传递给Foo \ BarBundle \ Menu \ MenuBuilder :: __ construct()的参数1必须实现接口Symfony \ Component \ Security \ Core \ SecurityContextInterface, none给出
有什么想法吗?
答案 0 :(得分:2)
应引用服务参数。
parameters:
services:
bar.menu_builder:
class: Foo\BarBundle\Menu\MenuBuilder
arguments: ["@security.context"]
答案 1 :(得分:1)
您是否在config.yml中导入了security.yml?像这样:
imports:
- { resource: parameters.yml }
- { resource: security.yml }
此外,你必须让你的对象通过容器,如下所示:
$this->get('bar.menu_builder');
如果这不起作用,那么您可以尝试清空缓存,因此它将重新编译容器。
斯特芬
答案 2 :(得分:0)
我不确定完全低估了为什么我遇到这个问题(我仍然是Symfony2的初学者),但我已经设法解决了它。
我添加了另一项服务来呈现我的菜单(请参阅here):
bar.menu.main:
class: Knp\Menu\MenuItem # the service definition requires setting the class
factory_service: bar.menu_builder
factory_method: createMainMenu
arguments: ["@knp_menu.factory"]
scope: request # needed as we have the request as a dependency here
tags:
- { name: knp_menu.menu, alias: main } # The alias is what is used to retrieve the menu
改变了:
{{ knp_menu_render('BarBundle:MenuBuilder:createMainMenu') }}
有关:
{{ knp_menu_render('main') }}
我认为,正如@Steffen Brem和@DonCallisto所建议的那样,bar.menu_builder
从未被检索过。