<?php
use Symfony\Component\DependencyInjection\ContainerBuilder;
interface Fooable
{
public function doFoo() : int;
}
class Foo implements Fooable
{
public function doFoo() : int
{
return 9;
}
}
class Bar implements Fooable
{
private $foo;
public function __construct(Foo $foo)
{
$this->foo = $foo;
}
public function doFoo() : int
{
return $this->foo->doFoo() + 1;
}
}
// create service definitions in container builder
$containerBuilder = new ContainerBuilder();
$fooDefinition = $containerBuilder->autowire('Foo', Foo::class)
->setPublic(true);
$containerBuilder->autowire('Bar', Bar::class)
->setPublic(true)
->setDecoratedService('Foo', 'Foo.inner')
->setArgument('Foo', $fooDefinition);
$containerBuilder->compile();
// Calling the decorated "Foo" service, that is now an instance of Bar
dump($containerBuilder->get('Foo')->doFoo());