我正在開發一個用於教育目的的PHP框架。自從我開始學習以來,我學到了很多東西。php依賴注入容器
我已決定如何處理依賴關係。我創建了一個簡單的DI容器。
我第一問題不是關於DI容器本身,而是如何注入所創建外(DI容器之前)對象。
問:在這個例子中:我打電話給container->manualAdd('_logger', $logger);
。有沒有另外一種方法來完成這個?我打破DI容器的想法嗎?
我第二問題是關於掛鉤的功能。所以當在自舉中所有的對象都被實例化時,它自己的對象現在可以開始運行。
問:在這個例子中:我創建了一個EventDispatcher。無論誰需要在doneBuild
或beforeTerminate
上做點什麼,都會注入BootstrapEventDispatcher
。有沒有另一種方法來做到這一點?
我開始覺得EventDispatcher
是矯枉過正(僅適用於bootstrap
),並可能實施類似:CodeIgniter:Hooks
任何幫助表示讚賞。
實施例的自舉(僞代碼):一個xml的
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}');
}
}
實施例:
<!-- 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的實現,例如疙瘩? (http://pimple.sensiolabs.org/)可能會給你一些想法。記錄器和調度器應該在需要時由容器本身創建。 Silex(http://silex.sensiolabs.org/doc/services.html)是一個微型框架,其主應用程序類擴展了Pimple。它可能會給你一些關於如何引導事物的想法。 – Cerad
我在看Silex並瞭解他們是如何做到的。謝謝! – OsakaHQ