【发布时间】:2013-06-05 18:39:10
【问题描述】:
我正在开发一个用于教育目的的 PHP 框架。自从我开始它以来,我学到了很多东西。
我已经决定如何处理依赖关系。我正在创建一个简单的 DI 容器。
我的第一个问题不是关于 DI 容器本身,而是如何注入在外部创建的对象(在 DI 容器之前)。
问: 在示例中:我打电话给container->manualAdd('_logger', $logger);。还有另一种方法可以做到这一点吗?我打破了 DI Container 的想法吗?
我的第二个问题是关于挂钩函数的。因此,当在 bootstrap 中实例化所有对象时,对象本身就可以开始工作了。
问:在示例中:我正在创建一个 EventDispatcher。无论谁需要在doneBuild 或beforeTerminate 上做某事,都会被注入BootstrapEventDispatcher。有没有其他方法可以做到这一点?
我开始认为EventDispatcher 是矫枉过正(仅适用于bootstrap),并且可能实现类似:CodeIgniter:Hooks
感谢任何帮助。
示例引导程序(伪代码):
function bootstrap($file = 'file.xml'){
$logger = new Logger();
$logger->log('bootstrap: init');
$dispatcher = new BootstrapEventDispatcher($logger);
$container = new DIContainer(new ConfigReader($file), $logger);
$container->manualAdd('_logger', $logger);
$container->manualAdd('_bootstrap_event_dispatcher', $dispatcher);
$container->build();
$dispatcher->doneBuild(null, new EventArgs());
$dispatcher->beforeTerminate(null, new EventArgs());
$logger->log('bootstrap: terminate');
}
class DIContainer{
public function build(){
//read xmls and create classes, etc.
$this->logger->log('DIContainer: creating objects: {objects}');
}
}
xml 示例:
<!-- example file.xml !-->
<services>
<service id="simple_class" class="SimpleClass"></service>
<service id="complex_class" class="ComplexClass">
<argument type="service" id="simple_class" /> <!-- dependency injection !-->
<argument type="service" id="_logger" /> <!-- dependency injection !-->
<argument type="service" id="_bootstrap_event_dispatcher" /> <!-- dependency injection !-->
</service>
</services>
ComplexClass 示例:
class ComplexClass{
public function __construct(SimpleClass $simpleClass, BootstrapEventDispatcher $dispatcher, Logger $logger){
$this->simpleClass = $simpleClass;
$this->logger = $logger;
$dispatcher->onDoneBuild(array($this, 'onBootstrapDoneBuild'));
}
public function onBootstrapDoneBuild($obj, $args){
//do something.
$this->logger->log('complexclass: did something');
}
}
【问题讨论】:
-
您是否查看过任何现有的 DIC 实现,例如 Pimple? (pimple.sensiolabs.org) 可能会给你一些想法。记录器和调度程序都应该在需要时由容器本身创建。 Silex (silex.sensiolabs.org/doc/services.html) 是一个微框架,其主要应用程序类扩展了 Pimple。它可能会给你一些关于如何引导事物的想法。
-
我正在研究 Silex 并了解他们是如何做到的。谢谢!
标签: php dependency-injection containers