Zend Frameworkを使って開発を進めていくと、利用するコンポーネントが増えていくにつれて、アプリケーションのINIファイル(一般的に使われている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ファイルを分割するというのもアリかも。