Curry
PHP Framework

初期設定

アプリケーションの初期設定

ここでいう初期設定とはアプリケーションのトップで行う、アプリケーション全体の基本動作を決める設定の事を指します。
初期設定の方法は3通りがあります。
一つはcurry.iniを使用した、設定ファイルによる初期設定です。通常はこれで設定します。
もう一つはInitializerクラスによる初期設定です。
最後の一つはindex.phpによる初期設定です。

curry.iniによる初期設定

最も簡単な設定方法です。
設定できる項目の詳細についてはカスタマイズのマニュアルを参照してください。
フレームワークの基本動作に関する各種設定が行えます。

Initializerによる初期設定(ver.1.3.0以降)

初期設定用のクラス"Initializer"を使用した初期設定が可能です。
Curryには初期設定用の基本クラス、InitializerStandardクラスが存在します。
このクラスで行なっているのはcurry.iniでの設定を実際に適用することです。
しかし、場合によって設定ファイルの設定値よりも優先して設定したい項目がある場合に便利なのがInitializerクラスを利用した初期設定です。
Initializerクラスの利用方法は以下のとおりです。

以上の条件を満たすと、initializeメソッドが自動的に実行されます。
実行タイミングはcurry.iniの設定適用の直後、URLルーティング処理の直前です。
そのため、curry.iniで行った設定と同じ項目をInitializer::initializeメソッドで実行すると、後者が優先され、設定が上書きされます。

以下の例では、curry.iniでデフォルトのアクションキーを"index"に設定していますが、Initializerで同じ設定を"default"にしているため、こちらが優先されます。

curry.ini
;--If you want to modify default action key, set this value.
default_action = "index"
app/initializer.php
class Initializer extends InitializerStandard
{
    public function initialize()
    {
        $this->router->setDefaultAction('default');
    }
}

index.phpでの初期設定

例えばDb::isSingletonなど、静的な設定メソッドはindex.phpでの設定も可能です。
しかしindex.phpでの設定はcurry.iniの適用より前のタイミングとなるため、curry.iniで設定した内容が優先されるため、index.phpでの設定はよほどの理由がない限りはやるべきではありません。
特にver1.3.0以降はInitializer::initializeで同じ事ができ、curry.iniよりも優先されるため、そちらで行う事を推奨します。

アプリケーション環境設定(ver.1.4.0以降)

Curryのバージョン1.4.0以降では、apacheの環境変数をもとにアプリケーションの動作環境を判別し、環境によって基本的な動作を切り分ける事ができます。
これを利用すると環境による違いの設定やコーディングをあらかじめ記述しておくことで、動作環境によって自動的にそれらの処理が切り分けられるため、環境によるソースの差異を無くす事ができ、デプロイミスの発生を抑えることができます。

この仕組みを利用するためにCurryが参照する環境変数は"APP_ENV"です。
apacheのhttpd.conf、または.htaccessでこの環境変数を設定します。

site/htdocss/.htaccess
SetEnv APP_ENV product
#SetEnv APP_ENV develop
#SetEnv APP_ENV test

APP_ENVの値はなんでも構いませんが、Curryで推奨するのは以下の3つです。

環境変数ごとに切り分けが可能なのは以下の3点です。

データベース接続設定

database.iniにはデータベース接続情報を設定しますが、環境変数APP_ENVの値と同じセクションでこれを定義することで、そのセクションを接続情報として参照します。
つまり、復数の環境変数のセクションを定義しておけば、同じ内容のdatabase.iniでも環境によって接続先のデータベースを変えることができるわけです。

database.iniの設定例
[product]
type     = mysql
host     = localhost
dbname   = site_db
user     = 
password = 

[develop]
type     = mysql
host     = localhost
dbname   = site_db_dev
user     = 
password = 

[test]
type     = mysql
host     = localhost
dbname   = site_db_test
user     = 
password = 

バージョン1.4.0未満の場合はセクション名は"connection"固定のため、このような設定には対応していません。
1.4.0以降でも"connection"セクションでの設定にも対応していますが、環境変数のセクションが定義されている場合はそちらが優先されます。1.4.0以降では環境変数セクションでの設定を推奨します。
※近い将来のバージョンでconnectionセクションでの設定の対応は削除される予定です。

エラーテンプレート

例外発生時に表示されるテンプレートは、エラーテンプレートディレクトリ(デフォルトではapp/views/templates/error/)に格納されていますが、デフォルトでは環境変数APP_ENVの値と同じ名前のテンプレートをエラーテンプレートとして表示しようとします。つまり、環境変数ごとのテンプレートを用意しておくことで、環境によって表示させるエラーメッセージを変える事ができます。

例えば本番環境では「システムエラーが発生しました」のような固定のエラーメッセージを表示するテンプレートにし、開発環境では例外の内容がわかるように例外情報を表示するテンプレートにするなどが可能になります。

app/views/templates/error/product.tpl
システムエラーが発生しました。
app/views/templates/error/develop.tpl
{$file}({$line})
<br />
{$message}
<br /><br />
{$trace|nl2br}

バージョン1.4.0未満の場合はエラーテンプレート名は"error"固定です。
ViewAbstract::setErrorTemplateメソッドにより個別に設定は可能ですが、環境変数によって自動的に切り分けるような仕組みは存在しません。
1.4.0以降でもエラーテンプレート名が"error"にも対応していますが、環境変数と一致するファイル名のテンプレートが存在する場合はそちらのが優先されます。1.4.0以降では環境変数のテンプレート名を推奨します。
※近い将来のバージョンで"error"という名前のエラーテンプレートへの対応は削除される予定です。

初期設定クラスの初期化メソッド

初期設定クラス、Initializerクラスに、環境変数APP_ENVの値に応じた、"init"で始まる名前のメソッドを定義すると、自動的にそのメソッドが実行されます。たとえばAPP_ENVが"product"であればinitProductメソッド、"develop"であればinitDevelopメソッドが実行されることになります。

あらかじめ各環境変数値に対応するメソッドを全て定義しておけば、環境によって実行されるメソッドが切り分けられ、特定の環境でのみ行いたい処理などを定義することができます。

class Initializer extends InitializerStandard
{
    public function initProduct()
    {
        // 本番環境のみ、カウンターを回す
        Loader::loadLibrary('Counter');
        $counter = new Counter();
        $counter->increment();
    }
    
    public function initDevelop()
    {
        // 開発環境のみ、PHPエラー出力
        ini_set("display_errors", 1);
        error_reporting(E_ALL);
    }	
}