无法向服务注入SecurityContext

时间:2013-12-01 12:56:28

标签: php symfony

我看过很多关于此事的帖子,但我不明白我做错了什么。

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给出

有什么想法吗?

3 个答案:

答案 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从未被检索过。