문제

구성에서 심포와 같 valdiating 구성되어 있습니다.나의 유효성을 검증하려는 내 구성 treebuilder.에 yml-를 들어,제가 아주는 방법의 예 config-트리처럼 보입니다(에서 미래 트리 것보다 더 큰 지금).하지만 이렇게 하기 위해 필요한 구조를 만들.
이제 당신은 나에게 도움이 될 수을 만들 treebuilder?해봤으로 모든 것을 arrayNode 및 프로토타입이지만,그것은 작동하지 않습니다.나 같은 예외

"FatalErrorException:오류:전화를 정의되지 않은 방법 심포\구성 요소\Config\정의\Builder odeBuilder::품()in/var/www/menu_bundle/src/my/MenuBundle/DependencyInjection/Configuration.php 선 29"


기본 아이디:

나를 생성하고 싶 Symfony2-bundle 을 만드는 menuStructure HTML.에 대한 generateing HTML 코드,내가 필요로 당겨하는 yaml-구성하는 개체-구조,이동,하지만 유효성을 검사하는 심포지 않는다.


여기에 빠른 예는 방법에 대 메뉴입니다.yml 봐야 한다:

my_menu_structure:
    menu:
        name: test
        cssClass: blubb
        children:
            child:
                name: item1
                route: route1
                position: 0
                  child:
                    name: item11
                    route: route11
                    position: 0
              child:
                  name: item2
                  route: route2
                  position: 1

지금 내가 원하는 구성 Treebuilder 에 Symfony2 지만,작동하지 않습니다..

후 몇 배의 노력하고,이것이 나의 마지막 버전:

    $treeBuilder = new TreeBuilder();
    $rootNode = $treeBuilder->root('my_menu');
        $rootNode
            ->children()
            ->arrayNode('menu')
            ->scalarNode('cssClass')
            ->defaultValue(array())
            ->prototype('array')
                ->scalarNode('name')
                ->scalarNode('route')
                ->scalarNode('Position')
                ->prototype('array')

        ->end()
        ->end()
        ->end();

나를 구축에 대한 개체 메뉴 menuitem 를.모든 작동까지,하지만 할 수 없을 구성 treebuilder.내가 찾는 방법을 다시 사용 부분(menuItem-:이름,경로와 어린이)에 treebuilder 지만,모든 것을 내가 지금까지 발견,도울 수 없다...다른 모든 일,내에만 문제할 수 없는 구성 Treebuilder 고 있을 수 있는 config 의 yml 과$이>컨테이너->얻('메뉴입니다.name').이 발생한 예외:요청하신 존재하지 않는 서비스"메뉴를 선택합니다.이름".

그래서 지금까지 시도했는 일부 구성으로 프로토타입('배열')지만,phpStorm 말 할 때마다,그것을 찾을 수 없습니다 scalarNode 의 자식으로 프로토타입 또는->프로토타입()->어린이()->scalarNode()..

도움이 되었습니까?

해결책

이 질문에서 날짜 januari2014,그러나 때는 솔루션을 찾고 있는 오류 메시지"를 호출을 정의되지 않은 방법 심포\구성 요소\Config\정의\Builder\ArrayNodeDefinition::arrayNode()"직접 질문에서 나왔는지 검색 결과입니다.

허용에 대답하지 않는 실제로 언급하는 이유의 오류 메시지가 표시됩니다.

예제에 의해 주어진 원래 포스터는 다음과 같습니다:

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('my_menu');
$rootNode
        ->children()
        ->arrayNode('menu')
        ->scalarNode('cssClass')
        ->defaultValue(array())
        ->prototype('array')
            ->scalarNode('name')
            ->scalarNode('route')
            ->scalarNode('Position')
            ->prototype('array')

    ->end()
    ->end()
    ->end();

이것은 잘못되었기 때문에 각 노드를 종료해야로 end() 전화입니다.로[문서][1]국:

에서 일반적인:를 정의한 후에는 노드를 호출하 end()을 한 단계에서는 계층 구조로 구성됩니다.

내 자신의 경우,무엇이었을 명확하게 되었다는 사실에는 arrayNode defition 모두 arrayNode() 정의로 기본 children() 정의는 끝나야 합니다.

그래서 위의 예에서 올바른 것 다음과 같다:

$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('my_menu');
$rootNode
    ->children()
        ->scalarNode('cssClass')->end()
        ->arrayNode('menu')
            ->prototype('array')
                ->scalarNode('name')->end()
                ->scalarNode('route')->end()
                ->scalarNode('Position')->end()
            ->end()
        ->end()
    ->end()
->end();

희망이 다른 사람을 도움이 될 것입니다 문제를 해결 보다 빨리 했습니다.

다른 팁

what you can do is to configure your rootNode this way:

    $rootNode
        ->children()
            ->arrayNode('menu')
            ->isRequired()
            ->prototype('array')
                ->children()
                ->scalarNode('label')->isRequired()->end()
                ->scalarNode('class')->end() // I added an optional class parameter
                //others parameters
                    ->arrayNode('sub_menu')
                        ->prototype('array')
                        ->children()
                            ->scalarNode('label')->isRequired()->end()
                            ->scalarNode('route')->end()
                            ->scalarNode('class')->end()
                            // add as many parameters as you want for your children
                        ->end()
                    ->end()
                ->end()
            ->end()
            ->end()
        ->end();

Then you want to pass this variable to a service. Very simple class :

class AdminMenu
{

    protected $menu;

    public function setMenu($menu)
    {
        $this->menu = $menu;
    }

    public function getMenu()
    {
        return $this->menu;
    }


}

In you services.xml

    <parameter key="wf.admin_menu.class">Acme\AdminBundle\Library\AdminMenu</parameter>

    <service id="wf.admin_menu" class="%wf.admin_menu.class%">
    </service>

In your bundleAdminExtension class

    $myServiceDefintion = $container->getDefinition('wf.admin_menu');
    $myServiceDefintion->addMethodCall('setMenu', array($config['menu']));

Finally, in any controller you want:

 $menu = $this->container->get('wf.admin_menu');

That's all :)

Edit : Here's what my config looks like

my_bundle_admin:
  menu:
    unique_key:
      label : 'Level1-1'
      class : ''
      sub_menu:
        sub_unique_key1:
          label: 'Level2-1'
          route: 'my_route'
        sub_unique_key2:
          label: 'Level2-2'
          route: 'my_route'
    unique_key_2:
      label : 'Level1-2'
      sub_menu :
        sub_unique_key1:
          label : 'Level2-1'
          route : 'my_route'
        sub_unique_key2:
          label : 'Level2-2'
          route : 'my_route'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top