【发布时间】:2015-09-10 20:31:41
【问题描述】:
我正在考虑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;
}
【问题讨论】:
标签: php oop dependency-injection inversion-of-control