2013-11-03 2 views
0

구성 파일을 통해 구성 할 수있는 메뉴를 관리하기 위해 번들을 만들려고합니다.구성 트리 : 조건부 유효성 검사 추가

그래서 class DependencyInjection\Configuration에 몇 가지 구성 제약 조건을 작성했습니다.

필요한 구성은 메뉴에 추가해야하는 항목의 배열입니다. 각 항목은 3 가지 유형 (link, link_notification, widget)을 가질 수 있습니다. 각 유형에 대해 항목에 다른 속성 (예 : route, label 등)이 필요합니다. 구성의

예 :

menu: 
    utilities: 
     - { type: link, icon: icon_name, label: text, route: { name: route_name, params: {} } } 
     - { type: link_notification, notification: notification_text } 
     - { type: widget, controller: controller_name } 

나는 각 유형에 대해 서로 다른 배열 제약 조건을 정의하는 방법을 찾을 수 없기 때문에 나는 갇혔어요.

IF type == "link" THEN scalarNode "icon" IS REQUIRED AND scalarNode "label" IS REQUIRED ... 

구성 파일은 다음과 같습니다 :

나는 상태 변환하는 방법을 찾을 수 없습니다 내가 Symfony2 문서의 방법 ->ifXXX() [...] ->then()을 보았다

public function getConfigTreeBuilder() 
    { 
     $treeBuilder = new TreeBuilder(); 
     $rootNode = $treeBuilder->root('aiomedia_menu'); 

     $rootNode 
      ->children() 
       ->arrayNode('utilities') 
        ->prototype('array') 
         ->children() 
          ->enumNode('type') 
           ->values(array ('link', 'link_notification', 'widget')) 
           ->isRequired() 
          ->end() 
         ->end() 
        ->end() 
       ->end() 
      ->end(); 

     return $treeBuilder; 
    } 

을,하지만 난 알아낼 수 없습니다 이 문맥에서 그들을 사용하는 방법.

답변

1

그것은 같은 것이다 : (테스트하지,하지만 그것은 당신에게 찾아 몇 가지 방향 제공)

$rootNode 
    ->children() 
     ->arrayNode('utilities') 
      ->prototype('array') 
       ->validation() 
        ->ifTrue(function ($v) { 
         if (!is_array($v)) { 
          return true; 
         } 

         switch ($v['type']) { 
          case 'link': 
           $requiredSettings = array('icon', 'label', 'route'); 
           break; 

          case 'link_notification': 
           $requiredSettings = array('notification'); 
           break; 

          case 'widget': 
           $requiredSettings = array('controller'); 
           break; 
         } 

         foreach ($requiredSettings as $setting) { 
          if (!array_key_exists($setting, $v)) { 
           return false; 
          } 
         } 

         return true; 
        }) 
        ->thenInvalid('Missing required options for "%s"') 
       ->end() 
       ->children() 
        ->enumNode('type') 
         ->values(array ('link', 'link_notification', 'widget')) 
         ->isRequired() 
        ->end() 
       ->end() 
      ->end() 
     ->end() 
    ->end();