Я опускаю голову вокруг DI
и IoC
; используя Pimple. Допустим, что у меня установлен IoC в начале потока выполнения
$container = new Injection\Container();
$container['config'] = function ($c) {
return new Config($c['loader']);
};
$container['request'] = function ($c) {
return new Request($c['config']);
};
...
И класс маршрутизатора, который call_user_func_array
//$class = 'Dog', $method = 'woof', $this->args = ['foo', 'bar']
call_user_func_array(array(new $class, $method), $this->args);
Итак, новый объект создается, не зная о IoC
, но все же я хотел бы повторно использовать некоторые из определенных служб.
class Dog
{
public function woof($var1, $var2)
{
//$request = IoC service here
}
}
Мой вопрос:
- Каким будет правильный способ передать
IoC
классу (статический, кажется, злой...) или - Нужно ли даже передавать контейнер вокруг и другие методы/понятия существуют?
Прочитайте некоторые интересные статьи, однако не смог понять это.
Обновление
Злой способ, которым я это сделал, определял другую службу, которая сохраняет IoC
в статическом свойстве
$container['services'] = function ($c) {
return Services::create($c); //make the service
};
$container['services']; //call the service
и получить доступ к нему позже в
class Dog
{
public function woof($var1, $var2)
{
$services = new Services();
$request = $services['request']; //retrieving the request service
}
}
Обновление 2
Решено использовать наименее вредный путь
//passing the container here
call_user_func_array(array(new $class($container), $method), $this->args);
И сохраните параметр в __constructor
public $container;
public function __construct(Injection\Container $container)
{
$this->container = $container;
}