application.ini
)の内容が膨らんでいく。特にZend Frameworkのバージョンアップに伴って、Zend_Applicationから利用できるリソースプラグインの種類が充実していくので、ソース中にハードコーディングしていたような環境依存パラメータは、どんどんINIファイルに移行するようになっていく。application.ini
ファイル内では、できるだけリソース毎にまとめて書くようにしているが、INIファイルをリソース毎に分けて管理できないものかと思っていた。
Zend_Applicationクリックスタートにあるように、
zf create project h2plus
と、Zend_Toolを使ってプロジェクトを作ると、configs
ディレクトリができて、その中にapplication.ini
だけが自動生成される。ディレクトリ名が複数形のconfigs
となっていることから、複数の設定ファイルを保存する場所として設計されていると読み取れるが、たいていの人は唯一の設定ファイルapplication.ini
にすべての設定を放り込んでいるのではないだろうか。
前置きはこのくらいにして早速プログラムに。
プロジェクトのブートストラップ(application/Bootstrap.php
)に、以下のような_initConfig()
関数を追加する。
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initConfig() { $this->bootstrap('frontController'); $exclude = array('.', '..', APPLICATION_CONFIG); $dir = dir(APPLICATION_PATH.'/configs'); while(($file = $dir->read()) !== false) { if(!in_array($file, $exclude) && fnmatch('*.ini', $file)) { $config = new Zend_Config_Ini("$dir->path/$file", APPLICATION_ENV); $this->setOptions($config->toArray()); } } $dir->close(); } }
やっていることは単純。application/configs
ディレクトリ内を走査して、INIファイルを見つけたらZend_Config_Iniを使ってロードしているだけ。6行目のAPPLICATION_CONFIG
は、Zend_Applicationのコンストラクタに渡す設定ファイル名と一致するものなので、public/index.php
内で以下のように定義している。
define('APPLICATION_CONFIG', 'application.ini'); // Create application, bootstrap, and run $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/' . APPLICATION_CONFIG );
ソースの修正はこれだけ。あとは、膨らんだapplication.ini
を管理しやすいように分割していけばいい。例えば、resources.db.*
の設定をdb.ini
に、resources.mail.*
をmail.ini
といった感じです。_initConfig()
をもう少し改良して、モジュール別にINIファイルを分割するというのもアリかも。