2012-11-25 10 views
1
<service id="my_service"> 
    <tag name="my_transport" supports="feature1, feature2, feature3" /> 
</service> 

在處理XML配置時,可以將supports屬性定義爲array而不是執行preg_split在XML配置中將Symfony 2標籤屬性定義爲數組?

+0

可能會創建多個''元素? –

+0

@WouterJ我認爲創建具有相同名稱的多個標籤將導致結果數組中只有一個條目,因爲標籤名稱被用作索引。 – gremo

回答

5

沒有辦法將屬性定義爲array

DependencyInjection裝載機不支持這一點。 (例來自yml加載拋出異常A "tags" attribute must be of a scalar-type (...)如果你試試這個)

XmlFileLoader loading tags使用phpize解析屬性值,空,布爾值,數字或字符串。

向服務定義添加標記不會覆蓋以前添加的標記的定義,但會向數組添加新條目。

public function addTag($name, array $attributes = array()) 
{ 
    $this->tags[$name][] = $attributes; 

    return $this; 
} 

所以,你應該嘗試創建多個<tag>元素(如沃特·Ĵ說)

如果您的XML文件會像

<service id="my_service"> 
    <tag name="my_transport" supports="feature1" /> 
    <tag name="my_transport" supports="feature2" /> 
    <tag name="my_transport" supports="feature3" /> 
</service> 

然後$屬性標籤my_transport

Array 
(
    [0] => Array 
     (
      [supports] => feature1 
     ) 

    [1] => Array 
     (
      [supports] => feature2 
     ) 

    [2] => Array 
     (
      [supports] => feature3 
     ) 

) 

樣本用法

use Symfony\Component\DependencyInjection\Reference; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 

class MyCompilerPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     $definition = $container->getDefinition('my_transport_service'); 

     // Extensions must always be registered before everything else. 
     // For instance, global variable definitions must be registered 
     // afterward. If not, the globals from the extensions will never 
     // be registered. 
     $calls = $definition->getMethodCalls(); 
     $definition->setMethodCalls(array()); 
     foreach ($container->findTaggedServiceIds('my_transport') as $id => $attributes) { 
      // print_r($attributes); 
      foreach($attributes as $attrs) 
      { 
       switch($attrs['supports']){ 
        case 'feature1': 
         $definition->addMethodCall('addTransportFeature1', array(new Reference($id))); 
         break; 
        case 'feature2': 
         $definition->addMethodCall('addTransportFeature2', array(new Reference($id))); 
         break; 
        case 'feature3': 
         $definition->addMethodCall('addTransportFeature3', array(new Reference($id))); 
         break; 
       } 
      } 
     } 
     $definition->setMethodCalls(array_merge($definition->getMethodCalls(), $calls)); 
    } 
} 
+0

很高興知道,我會去preg_split。我需要添加一個接受數組的方法調用。謝謝! – gremo