재귀적 구조를 제거하기 위해서는,수평 또는 수직으로 Symfony2Treebuilder
-
21-12-2019 - |
문제
구성에서 심포와 같 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'