Ethnaアプリケーションの設定ファイル
Ethna では、PHPファイルやテンプレートファイルを ethnaコマンドで生成し、生成したものを主に弄っていきます。しかし、アプリケーション全体に共通する設定というのも存在しており、それらは別に記述する必要があります。ここでは、そうしたアプリケーション全体の設定について説明します。
書いた人 | ---- | ---------- | 新規作成 |
書いた人 | mumumu | 2009-06-15 | 最新版に追随する形で全面的に修正 |
設定ファイルの置き場所
以下のようにアプリケーションIDを「sample」としてプロジェクトを作成すると、sample/etc/sample-ini,php に設定ファイルが作成されます。
$ ethna add-project sample $ cd sample/etc $ ls sample-ini.php
つまり、etc/[アプリケーションID]-ini.php が設定ファイルの置き場所ということになります。
設定値を制御する
設定値を記述する
Ethnaの設定ファイルは素のPHPを使って記述します。上で説明した etc/[アプリケーションID]-ini.php に、$config というグローバル変数を書き、そこに配列の形で定義を行います。
$config = array( 'debug' => false, 'dsn' => 'mysql://user:pass@unix+localhost/dbname', );
ここに設定した値は、変更すると次のリクエストからすぐに反映されます。この変数に一ヶ所に纏めることで、環境が変わった場合の対応も容易になります。
設定値を取得する
Ethnaには設定値の制御を行うクラスとして Ethna_Config があります。このクラスを利用すれば、上記で設定したファイルの設定値が容易に取得できます。
ユーザーが主に触ることになるアクションクラスやビュークラス、アプリケーションマネージャークラスには、$config というメンバで Ethna_Config クラスのインスタンスが定義されています。よって、getメソッドを使って設定値を取得することができます。
以下はアクションクラスで設定値を取得する例です。Ethna_ConfigクラスのAPIドキュメントも参照してください。
class Sample_Action_Index extends Ethna_ActionClass { function prepare() { return null; } function perform() { // dsn という設定値を取得 $dsn = $this->config->get('dsn'); //.... 残りの処理 } }
個別の設定値の詳細
ここでは、Ethna で設定できる設定値のすべてを詳細に示します。
デバッグ設定
$config = array( 'debug' => false, // デフォルトはfalse );
デバッグ設定は開発時に使用するもので、true または false で指定します。 この値をtrueにした場合、以下の機能が実行できるようになります。
- www/info.php によるアプリケーション情報の一覧
- www/unittest.php による単体テスト実行
ユニットテストを実行する と 設定情報や定義済みアクション等を一覧する も参照してください。
本番環境でこの値を絶対trueに設定しないで下さい! 上記の機能はユーザーに見せるものではないからです!
データベース接続設定
$config = array( // sample-1: single db 'dsn' => 'mysql://user:password@server/database', // sample-2: single db w/ multiple users 'dsn' => 'mysql://rw_user:password@server/database', // read-write 'dsn_r1' => 'mysql://ro_user:password@server/database', // read-only // sample-3: multiple db (slaves) 'dsn' => 'mysql://rw_user:password@master/database', // read-write(master) 'dsn_r2' => array( 'mysql://ro_user:password@slave1/database', // read-only(slave) 'mysql://ro_user:password@slave2/database', // read-only(slave) ), );
上記のようにdsnというkeyにDSNを記述することでBackendからgetDBによってDBオブジェクトが呼び出されてコネクトするときのDSNを指定することができます。
データベースオブジェクトを、アクションクラスやアプリケーションマネージャーでは以下の形で取得することが出来ます。
$this->backend->getDB('r'); // dsn_r の設定を返す
ひとつのdsnに複数の接続先が配列で指定された場合は、ランダムに接続先が返ってきます。
$this->backend->getDB('r2'); // dsn_r2 の接続を返す。
データベースアクセスのページも参照してください。
ログ出力の設定
ログ出力の設定の詳細については、Ethnaでログ出力を制御する のページを参照してください。
memcached
memcached も、データベース接続設定と同様に多様な設定が可能です。memcached がひとつの場合の設定を以下に示します。
$config = array( // sample-1: single (or default) memcache 'memcache_host' => 'localhost', // memcached を置いているホスト 'memcache_port' => 11211, // ポート番号 'memcache_use_pconnect' => false, // 永続的な接続をサポートするか 'memcache_retry' => 3, // 接続に失敗した場合のリトライ回数 'memcache_timeout' => 3, // 接続タイムアウト値 );
以下のように名前空間を指定して複数台のmemcached を指定することも可能です。
$config = array( // sample-2: multiple memcache servers (distributing w/ namespace and ids) 'memcache' => array( 'namespace1' => array( 0 => array( 'memcache_host' => 'cache1.example.com', 'memcache_port' => 11211, ), 1 => array( 'memcache_host' => 'cache2.example.com', 'memcache_port' => 11211, ), ), ), );
国際化設定
この機能を利用するには、Ethna 2.5.0 preview2 以降が必要です。
$config = array( 'use_gettext' => false, );
Ethnaプロジェクトを国際化する手段として、iniファイルを利用する方法と、gettext を利用する方法の2種類が用意されています。デフォルトは iniファイルを利用する方法です。詳細は プロジェクトの国際化(2.5.0 preview2以降) を参照してください。
gettext を利用する場合に、この値を true にします。
CSRF対策
$config = array( 'csrf' => 'Session', );
CSRF とは、ログイン済みのユーザーに細工したURLを踏ませることで、ログイン済みユーザの権限を利用して意図しない操作を実行させるものです。詳細は クロスサイトリクエストフォージェリの対策コードについて を参照してください。
デフォルト値は、上記のように 'Session' となっており、正当な値をセッションに格納するようになっています。現状はこの値を変更できません。
設定値をiniファイルで管理する
etc/[appid]-ini.phpの中では変数の定義だけでなくロジックの記述もできるので
config.ini
debug = false dsn = mysql://user:password@localhost/db
を用意しておいて
etc/[app-id]-ini.php内で
$config = parse_ini_file('config.ini', true);
としておけば設定値をiniファイルに記述することができます。*1
設定値をyamlで管理する
iniファイルとほとんど同じ手法でできます。 bogoYAMLのスタイルでよければharukiさんが作ったbogoYAMLを利用して YAMLで記述したデータを配列として取得するだけです。詳しくは、以下を参照して下さい。
*1 この例では、parse_ini_file 関数への第二引数を true にして、セクション定義を解釈させるようになっていますが、dsn のようなEthnaの動作の根本に関わる一部の設定値については、セクション定義されていないことを前提に値を取得する実装が Ethna でなされているため、セクション定義しない方が無難かもしれません