У меня есть простое приложение, и я пытаюсь начать использовать контейнер DI. Я скачал Pimple, изучил код и документацию. Через некоторое время я пришел к забавным вещам. У меня есть два класса, которые в особых случаях общаются между собой.
class Foo
{
/**
* @var Bar
*/
private $bar;
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
}
class Bar
{
/**
* @var Foo
*/
private $foo;
public function __construct(Foo $foo)
{
$this->foo = $foo;
}
}
Я определил контейнер Pimple с двумя классами, например так:
$container = new Pimple\Container();
$container['foo'] = function($c)
{
return new Foo($c['bar']);
};
$container['bar'] = function($c)
{
return new Bar($c['foo']);
};
Вот контейнер var_dumped:
object(Pimple\Container)[14]
private 'values' =>
array (size=2)
'foo' =>
object(Closure)[17]
'bar' =>
object(Closure)[18]
private 'factories' =>
object(SplObjectStorage)[15]
private 'protected' =>
object(SplObjectStorage)[16]
private 'frozen' =>
array (size=0)
empty
private 'raw' =>
array (size=0)
empty
private 'keys' =>
array (size=2)
'foo' => boolean true
'bar' => boolean true
Проблема в том, что когда я создаю use $ container [‘foo’], он пытается внедрить класс Bar, для которого требуется foo, поэтому возникает ошибка с максимальным вложением. Моя идея, почему не прошло закрытие? Что будет выполнено, когда это будет действительно необходимо в классе?
Или я совершенно не понял, что такое закрытие?
Задача ещё не решена.
Других решений пока нет …