factories.xmlで定義されたクラスの初期化順序
factories.xmlで定義されるシステムクラスの初期化のタイミングが気になったので調べてみた。以下はfactories.xmlのコンパイルキャッシュです。
<?php $this->databaseManager = new AgaviDatabaseManager(); $this->databaseManager->initialize($this, array ()); $this->databaseManager->startup(); $this->loggerManager = new AgaviLoggerManager(); $this->loggerManager->initialize($this, array ()); $this->loggerManager->startup(); $this->request = new AgaviWebRequest(); $this->request->initialize($this, array ()); $this->routing = new AgaviWebRouting(); $this->routing->initialize($this, array ()); $this->controller = new AgaviController(); $this->controller->initialize($this, array ()); $this->storage = new AgaviSessionStorage(); $this->storage->initialize($this, array ()); $this->storage->startup(); $this->user = new AgaviSecurityUser(); $this->user->initialize($this, array ()); $this->user->startup(); $this->routing->startup(); $this->request->startup(); $this->controller->startup(); $this->shutdownSequence = array($this->controller, $this->request, $this->routing, $this->user, $this->storage, $this->loggerManager, $this->databaseManager); ?>
システムクラスにはinitializeとstartupの2つの初期化フェイズが用意されていますがそれらが呼び出されるタイミングはクラスによって異なるようです。また、大まかな流れとしてDBマネージャ→Loggerマネージャ→その他という順に初期化されるようです。前者2つはWebアプリの性質上無いと話にならないですからね。
また、ユーザの初期化を境にしてstartupまで完了するのはDB,Logger,Storageの3つで、Routing,Request,Controllerはユーザの初期化がstartupまで完了した時点で呼び出されます。Request,Routing,Controllerのstartupを見てみると、Requestではスーパーグローバル変数の初期化、Routingではルーティングソースの設定、Controllerではリクエストデータの設定を行っているだけなので、ディスパッチ以前に必要な処理には影響しないようになっています。
結論として、Userの初期化フェイズでは安心してシステムクラスをいじれますよってことです。