教育目的で PHP フレームワークを開発しています。私はそれを始めて以来、多くのことを学びました。
依存関係をどのように処理するかを決定しました。私は単純な DI コンテナーを作成しています。
私の最初の質問は、DI コンテナー自体についてではなく、外部 (DI コンテナーの前) で作成されたオブジェクトを注入する方法です。
Q:例: 私は を呼び出してcontainer->manualAdd('_logger', $logger);
います。これを達成する別の方法はありますか?DI コンテナーのアイデアを壊していますか?
2 番目の質問は、関数のフックについてです。そのため、ブートストラップですべてのオブジェクトがインスタンス化されると、オブジェクト自体が機能し始めることができます。
Q:例: 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');
}
}