2013-04-10 2 views
15

내 구성 노드 sourcestringarray 값을 모두 지원할 수 있습니까? string에서구성 노드가 Symfony 2 구성에서 문자열과 어레이를 모두 지원합니까?

소싱 :

# Valid configuration 1 
my_bundle: 
    source: %kernel.root_dir%/../Resources/config/source.json 

소싱 array에서 :

if (is_array($config['source']) { 
    // Bootstrap from array 
} else { 
    // Bootstrap from file 
} 

나는 이런 식으로 뭔가를 사용할 수 있습니다 :

# Valid configuration 2 
my_bundle: 
    source: 
     operations: [] 
     commands: [] 

확장 클래스들을 구별 할 수있을 것입니다 :

$rootNode->children() 
    ->variableNode('source') 
     ->validate() 
      ->ifTrue(function ($v) { return !is_string($v) && !is_array($v); }) 
      ->thenInvalid('Configuration value must be either string or array.') 
     ->end() 
    ->end() 
->end(); 

는하지만 내가 어떻게 (그 값이 유형 array의 경우 그에만 시행되어야한다) 변수 노드 (... 등, 명령, 운영) source의 구조에 제약 조건을 추가 ca를?

답변

19

확장 기능을 리팩토링하여 구성 정상화를 사용할 수 있다고 생각합니다. 확장에

는 경로가

if ($config['path'] !== null) { 
    // Bootstrap from file. 
} else { 
    // Bootstrap from array. 
} 

설정되어 있는지 확인하는 코드를 변경하고 사용자가 설정을위한 문자열을 사용할 수 있습니다.

$rootNode 
    ->children() 
     ->arrayNode('source') 
      ->beforeNormalization() 
      ->ifString() 
       ->then(function($value) { return array('path' => $value); }) 
      ->end() 
      ->children() 
       ->scalarNode('foo') 
       // ... 
      ->end() 
     ->end() 
    ->end() 
; 

이와 같이 사용자는 유효성을 검사 할 수있는 문자열이나 배열을 사용할 수 있습니다.

symfony documentation for normalisation

그것이 도움이 희망을 참조하십시오. 감사합니다.

+0

나쁘지 않습니다. 나는'path'와'operations'과'commands'가 설정된 경우를 처리해야합니다. 나를 위해 +1 – gremo

6

은 일부 사용자 지정 유효성 검사 논리와 조합에 variable node 유형을 사용할 수 있습니다 :

<?php 
use Symfony\Component\Config\Definition\Builder\TreeBuilder; 
use Symfony\Component\Config\Definition\Exception\InvalidTypeException; 

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

    $rootNode 
     ->children() 
      ->variableNode('source') 
       ->validate() 
        ->ifTrue(function ($v) { 
         return false === is_string($v) && false === is_array($v); 
        }) 
        ->thenInvalid('Here you message about why it is invalid') 
       ->end() 
      ->end() 
     ->end(); 
    ; 

    return $treeBuilder; 
} 

이 것 성공적으로 과정 :

my_bundle: 
    source: foo 

# and 

my_bundle: 
    source: [foo, bar] 

하지만 처리하지 않습니다 :

my_bundle: 
    source: 1 

# or 

my_bundle 
    source: ~ 

물론 올바른 확인 규칙을 얻지는 못합니다. 정상적인 구성 ation 노드가 제공하고 전달 된 배열 (또는 문자열)에 대한 유효성 검사 규칙을 사용할 수 없지만 사용 된 클로저에서 전달 된 데이터의 유효성을 검사 할 수 있습니다.

+0

예, 이미 이와 비슷한 것을 사용했습니다. 그러나 이번에는 배열 노드가 매우 복잡합니다. – gremo

+0

가능한지 확실하지 않습니다. JMSDiExtraBundle에서 사용하는 것과 같은 다른 구조를 사용할 수 없습니까? –