設定ファイルでdefine()を並べる、ってのはよく見かける風景ですが、あれは少しでもPHPの知識がないとよくわかりません。
ということで簡単にiniやXML形式で設定を書けるようにできるのがZend_Configです。
> 現時点で Zend_Config が提供している設定データアダプタは Zend_Config_Ini と Zend_Config_Xml の二種類
http://framework.zend.com/manual/ja/zend.config.introduction.html
とか書かれていますが、実はしれっとYAML、JSON、そしてPHPの配列に対応しておりヘルプも書かれています。
http://framework.zend.com/manual/ja/zend.config.html
サンプルは何故かそれぞれのサンプルがバラバラな形になっているのですが、とりあえずZend_Config_Iniと形式を揃えて使ってみます。
config.ini
[production] webhost = www.example.com database.adapter = pdo_mysql database.params.host = db.example.com database.params.username = dbuser database.params.password = secret database.params.dbname = dbname [staging : production] database.params.host = dev.example.com database.params.username = devuser database.params.password = devsecret
config.json
{
"production":{
"webhost": "www.example.com",
"database":{
"adapter": "pdo_mysql",
"params":{
"host": "db.example.com",
"username": "dbuser",
"password": "secret",
"dbname": "dbname"
}
}
},
"staging":{
"_extends": "production",
"database":{
"params":{
"host": "dev.example.com",
"username": "devuser",
"password": "devsecret"
}
}
}
}
config.xml
<?xml version="1.0"?>
<configdata>
<production>
<webhost value="www.example.com" />
<database>
<adapter value="pdo_mysql" />
<params>
<host value="db.example.com" />
<username value="dbuser" />
<password value="secret" />
<dbname value="dbname" />
</params>
</database>
</production>
<staging extends="production">
<database>
<params>
<host value="dev.example.com" />
<username value="devuser" />
<password value="devsecret" />
</params>
</database>
</staging>
</configdata>
config.yaml
production:
webhost: www.example.com
database:
adapter: pdo_mysql
params:
host: db.example.com
username: dbuser
password: secret
dbname: dbname
staging:
_extends: production
database:
params:
host: dev.example.com
username: devuser
password: devsecret
config.php
<?php
$arr_production = array(
'webhost' => 'www.example.com',
'database' => array(
'adapter' => 'pdo_mysql',
'params' => array(
'host' => 'db.example.com',
'username' => 'dbuser',
'password' => 'secret',
'dbname' => 'mydatabase'
)
)
);
$arr_staging = array(
'webhost' => 'www.example.com',
'database' => array(
'adapter' => 'pdo_mysql',
'params' => array(
'host' => 'dev.example.com',
'username' => 'devuser',
'password' => 'devsecret',
'dbname' => 'mydatabase'
)
)
);
return _IS_PRODUCTION ? $arr_production : $arr_staging;
index.php
<?php
//Zend_Config
require_once('Zend/Config.php');
require_once('Zend/Config/Ini.php');
require_once('Zend/Config/Json.php');
require_once('Zend/Config/Xml.php');
require_once('Zend/Config/Yaml.php');
//Zend_Config_Ini
$config_ini = new Zend_Config_Ini('config.ini', 'staging');
//Zend_Config_Json
$config_json = new Zend_Config_Json('config.json', 'staging');
//Zend_Config_Xml
$config_xml = new Zend_Config_Xml('config.xml', 'staging');
//Zend_Config_Yaml
$config_yaml = new Zend_Config_Yaml('config.yaml', 'staging');
//Zend_Config
define('_IS_PRODUCTION', true);
$config_php = new Zend_Config(require_once('config.php'));
簡易さではiniとYAMLが飛び抜けてますね。
実は$config = new Zend_Config('config.ini', 'staging', Zend_Config::INI)とかできません。
Zend/Config.phpではなく、Zend/Config/Ini.phpなど使用形式に対応したアダプタを直接インクルードしないといけません。
これ、ヘルプの何処にも書かれてないんですが。
上記で取得したZend_Configインスタンスはどれも、
Zend_Db::factory($config->database);
というふうに同じ使い方が可能です。
またCountableおよびIteratorインターフェイスを実装しているのでcount()やforeachも使えます。
好きな形式でコンフィグを書くとよいでしょう。
PHPだけ設定の継承をしておらず、プロダクションかステージングかを引数に渡すこともできず残念なことになっています。
PHPの配列による設定はあくまでおまけのようなものです。
つうかPHPで書くんだったらZend_Config使う意味ねえよ。
PR
トラックバック
トラックバックURL: