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

?を実行する代わりに、XML 構成を扱うときのようにsupports属性を定義することは可能でしょうか?arraypreg_split

4

1 に答える 1

5

属性を として定義する方法はありませんarray

DependencyInjection ローダーはこれをサポートしていません。(例:これを試してみるとyml例外がスローされます)A "tags" attribute must be of a scalar-type (...)

タグをロードする XmlFileLoader は、null、ブール値、数値、または文字列としてphpize解析属性値を使用します。

タグをサービス定義に追加しても、以前に追加されたタグの定義は上書きされませんが、配列に新しいエントリが追加されます。

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

    return $this;
}

したがって、複数の要素を作成してみてください<tag>(Wouter Jが言ったように)

XMLファイルが次のようになる場合

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

タグの $attributesmy_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));
    }
}
于 2012-11-26T00:21:28.047 に答える