2017-11-16 11 views
1

Symfony 3.3.12を使用して、メニュービルダーをサービスとして使用しようとしています。これはAppBundle/Resources /config/services.ymlと引数1がBuilder :: __ construct()に渡され、インターフェイスKnp Menu FactoryInterfaceが実装されていなければなりません。

imports: 
    - { resource: "@AppBundle/Resources/config/services.yml" } 

services.yml

########################################################################## 
# Menu Section 
########################################################################## 
AppBundle\Menu\Builder: 
    arguments: 
     $factory: '@knp_menu.factory' 
     $doctrine: '@doctrine' 
     $token: '@security.token_storage' 
    public: true 
    tags: 
     - { name: knp_menu.menu_builder, method: sidebarMenu, alias: sidebar } 

としてメインconfig.ymlにインポートしかし、私はrenderd

{{ knp_menu_render('sidebar', {'template': 'Menu/knp_sidebar_menu.html.twig', 'allow_safe_labels': true, 'currentClass':'active'}) }} 
として、このエラーが出ますビルダー渡さ0

引数1 :: __構築物()どれも /ホーム/ demousr /アプリ/ベンダー/ knplabs/KNP-メニュー-バンドル/プロバイダ/に呼び出され、与えられていない、インターフェイス KNP \メニューの\ FactoryInterfaceを実装する必要がありますライン上のBuilderAliasProvider.php は121

これは私が

+0

ですそれを容器から引き出すのではなく、行番号は異なるが、githubのコードはこれを確認しているようだ。ソースコードを見て、121行目を見てください。 – Cerad

+0

BuilderAliasProviderの@Cerad @ $ builder = new $ class();これは依存関係を挿入せずに新しいオブジェクトを作成しています。代わりに[BuilderServiceProvider](https://github.com/KnpLabs/KnpMenuBundle/blob/master/Provider/BuilderServiceProvider.php)を使うべきだと思います。私のビルダーはサービスとして認識されていないようです –

+0

うん。 BuilderServiceProviderがコンテナから引き出されます。 – Cerad

答えて

0

私はちょうどまし間違っている場所を見つけることができない私のビルダー

namespace AppBundle\Menu; 

use \Knp\Menu\FactoryInterface; 
use \AppBundle\Menu\Loader\NodeLoader; 
use \Doctrine\Bundle\DoctrineBundle\Registry; 
use \Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; 

class Builder { 

    private $factory; 
    private $doctrine; 
    private $token; 

    public function __construct(FactoryInterface $factory, Registry $doctrine, TokenStorage $token) { 
     $this->factory = $factory; 
     $this->doctrine = $doctrine; 
     $this->token = $token->getToken(); 
    } 

    public function sidebarMenu(array $options) { 

     $menu = $this->factory->createItem('root'); 
     $nodeLoader = new NodeLoader($this->factory, $this->token); 

     $menu->setChildrenAttribute('class', 'nav nav-sidebar'); 

     $em = $this->doctrine->getManager(); 
     $tree = $em->getRepository('AppBundle:Menu\Menu')->findOneByMenu('main'); 
     $roots = $em->getRepository('AppBundle:Menu\MenuItem')->getRootNodesByTree($tree); 

     foreach($roots as $root){ 

      $item = $nodeLoader->load($root); 

      if(null !== $item){ 
       $menu->addChild($item); 
      } 
     } 

     return $menu; 
    } 

} 

ですMenuBuilderのクラス名とメソッドをcreateSidebarMenuに変更し、新しいクラス名でサービスIDを変更しました。私にとって大きなミステリー。

service.yml

########################################################################## 
# Menu Section 
########################################################################## 
AppBundle\Menu\MenuBuilder: 
    arguments: 
     $factory: '@knp_menu.factory' 
     $doctrine: '@doctrine' 
     $token: '@security.token_storage' 
    public: true 
    tags: 
     - { name: knp_menu.menu_builder, method: createSidebarMenu, alias: sidebar } 

そして、これがMenuBuilder.php私は、このバンドルを使用していないが、エラーメッセージがAliasProviderが新しいあなたのビルダーにしようとしていることを示すように思わ

class MenuBuilder { 

    private $factory; 
    private $doctrine; 
    private $token; 

    public function __construct(FactoryInterface $factory, Registry $doctrine, TokenStorage $token) { 
     $this->factory = $factory; 
     $this->doctrine = $doctrine; 
     $this->token = $token->getToken(); 
    } 

    public function createSidebarMenu(array $options) { 
     # code 
    } 
} 
関連する問題