2013-12-01 4 views
2

Я видел много сообщений об этом, но я не понимаю, что я делаю неправильно.Не удалось ввести SecurityContext с услугами

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: Argument 1 passed to Foo\BarBundle\Menu\MenuBuilder::__construct() must implement interface Symfony\Component\Security\Core\SecurityContextInterface, none given

Любая идея?

+1

Просто для моего любопытства, поскольку я видел эту ошибку много раз и каждый раз та же самая проблема, которая вызывает это, как вы можете восстановить свою службу bar.menu_builder? Не могли бы вы дать нам фрагмент соответствующего кода? – DonCallisto

ответ

0

Я не уверен полностью understrand, почему у меня был этот вопрос (я еще новичок с 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 был просто не получен.

2

Аргументы службы должны быть указаны.

parameters: 

services: 
    bar.menu_builder: 
     class: Foo\BarBundle\Menu\MenuBuilder 
     arguments: ["@security.context"] 
+0

Возможно, вы правы, но это не решило проблему. – Arthur

+0

Попробуйте очистить кеш. Или проверьте, были ли вы импортированы ваши services.yml –

1

Вы импортировали security.yml в свой config.yml? Как так:

imports: 
    - { resource: parameters.yml } 
    - { resource: security.yml } 

Кроме того, вы должны получить ваш объект корыто контейнер, например, так:

$this->get('bar.menu_builder'); 

Если это не работает, то вы можете попытаться очистить кэш, так что это будет перекомпилируйте контейнер.

Штеффен

Смежные вопросы