<service id="my_service">
<tag name="my_transport" supports="feature1, feature2, feature3" />
</service>
?を実行する代わりに、XML 構成を扱うときのようにsupports
属性を定義することは可能でしょうか?array
preg_split
<service id="my_service">
<tag name="my_transport" supports="feature1, feature2, feature3" />
</service>
?を実行する代わりに、XML 構成を扱うときのようにsupports
属性を定義することは可能でしょうか?array
preg_split
属性を として定義する方法はありません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));
}
}