したがって、サービスの配列ではなく、パラメーターの配列を注入します。次の方法でサービスごとにサービスを注入できます。
<services>
<service id="notifications_decorator" class="\NotificationsDecorator">
<argument type="service" id="decorator1"/>
<argument type="service" id="decorator2"/>
<argument type="service" id="decorator3"/>
</service>
</services>
または(私の意見では、より良い方法で)サービスにタグ を付けて、コンパイルパス中にdecorators
それらを挿入します。notifications_decorator
更新: タグ付きサービスの操作
あなたの場合、次のようにサービスを変更する必要があります。
<services>
<service id="decorator1" class="\FirstDecorator">
<tag name="acme_decorator" />
</service>
<service id="decorator2" class="\SecondDecorator">
<tag name="acme_decorator" />
</service>
<service id="decorator3" class="\ThirdDecorator">
<tag name="acme_decorator" />
</service>
</services>
decorators.all
さらに、セクションからパラメーターを削除する必要があります<parameters>
。次に、次の sth のようなaddDectorator
関数を追加する必要があり\NotificationsDecorator
ます。
class NotificationsDecorator
{
private $decorators = array();
public function addDecorator($decorator)
{
$this->decorators[] = $decorator;
}
// more code
}
のインターフェイスを作成し、これをfor関数decorator
の型として追加するとよいでしょう。$decorator
addDecorator
次に、独自のコンパイラ パスを作成し、タグ付けされたサービスについて尋ね、このサービスを別のサービスに追加する必要があります (ドキュメントと同様):
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\Reference;
class DecoratorCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
if (!$container->hasDefinition('notifications_decorator')) {
return;
}
$definition = $container->getDefinition('notifications_decorator');
$taggedServices = $container->findTaggedServiceIds('acme_decorator');
foreach ($taggedServices as $id => $attributes) {
$definition->addMethodCall(
'addDecorator',
array(new Reference($id))
);
}
}
}
最後に、次のようにバンドル クラスDecoratorCompilerPass
に toを追加する必要があります。Compiler
class AcmeDemoBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new DecoratorCompilerPass());
}
}
幸運を!