![]() |
|
The symfony and Doctrine book3章 - 設定 |
|
You are currently reading "The symfony and Doctrine book" which is licensed under the GFDL license.

Doctrineは機能と設定を属性(attribute)で制御します。属性を異なるレベルの階層で定義できます。 属性の中にはすべてのレベルで指定できるものもあればそうではないものもあります。 この章ではそれぞれのレベルで属性を指定する方法を説明します。属性は、個別の接続、モデルごとにグローバルに指定できます。
symfonyではconfig/ProjectConfiguration.class.phpもしくはapps/appname/config/appnameConfiguration.class.phpの中でDoctrineの構成を制御できます。
設定の中でconfigureDoctrine()を作ることでグローバル属性を制御できます。
すべてのグローバル属性はSingletonのDoctrine_Managerインスタンスで設定されます。
sfDoctrinePluginのconfig.phpがロードされるときにこのメソッドが起動します。
これは接続が存在する前なので、この時点ではDoctrine_Manager属性のみが制御できます。
public function configureDoctrine(Doctrine_Manager $manager) { $manager->setAttribute('use_dql_callbacks', true); $manager->setAttribute('use_native_enum', true); }
設定クラスの中でconfigureDoctrineConnection()を作ることで接続属性ごとに制御できます。
config/databases.ymlで記述されている順序でそれぞれの接続がsymfonyによってインスタンス化されるときsfDoctrineDatabaseの中でこのメソッドが呼び出されます。
public function configureDoctrineConnection(Doctrine_Connection $connection) { $connection->setAttribute('use_dql_callbacks', true); $connection->setAttribute('use_native_enum', true); }
オプションとしてconfig/doctrine/databases.ymlの中で接続属性を直に指定することもできます:
doctrine:
class: sfDoctrineDatabase
param:
dsn: 'mysql:host=localhost;dbname=dbname'
username: user
password: secret
attributes:
use_dql_callbacks: true
use_native_enum: true
それぞれの接続ごとに異なる設定を用意するのであれば個別の接続ごとに起動する特別な関数を作ることもできます。
masterという名前の接続を用意するのであればconfig/ProjectConfniguration.class.phpファイルの中でconfigureDoctrineConnectionMaster()という名前の関数を作ることが必要になります。
public function configureDoctrineConnectionMaster(Doctrine_Connection $connection) { $connection->setAttribute('use_dql_callbacks', false); $connection->setAttribute('use_native_enum', false); }
上述の例では、use_dql_callbacksとuse_native_enumはmaster接続以外に対して有効です。
Doctrine用の最後のレベルの階層はモデルです。YAMLフォーマットのモデルの定義で属性を直に指定できます。
Store:
connection: client
attributes:
export: tables
columns:
name: string(255)
description: string(500)
PHPコードを利用して属性をlib/model/doctrineの中の生成モデルクラスに設定することもできます。
lib/model/doctrine/Store.class.phpを確認して追加属性をいくつか指定するためにsetTableDefinition()をオーバーライドします。
public function setTableDefinition() { parent::setTableDefinition(); $this->setAttribute('export', 'tables'); }
sfDoctrinePluginはモデルのデフォルトのビルド方法のオプションをいくつか上書きする機能を提供します。
これらの設定はsfConfigクラスの中でdoctrine_model_builder_optionsという名前のパラメーターを使うことで制御できます。
モデルを生成するときに使われる基底クラスを変更する例は次の通りです。
基底クラスをたとえばmyDoctrineRecordと設定できます。
symfonyのオートロード機能がクラスを見つけられるようになっているか確認してください。
public function configureDoctrine(Doctrine_Manager $manager) { $options = array('baseClassName' => 'myDoctrineRecord'); sfConfig::set('doctrine_model_builder_options', $options); }
クラスを必ず作ってください。たとえば、sfproject/lib/myDoctrineRecord.class.phpのPHPコードは次の通りです。
class myDoctrineRecord extends sfDoctrineRecord { }
モデルを生成するとき、すべてのクラスはsfDoctrineRecordの代わりにmyDoctrineRecordを継承するのですべてのモデルにカスタムの機能を追加できます。
モデルのビルドプロセスのための異なる値に変更できるすべてのオプションの一覧です。
| 名前 | 説明 | デフォルト |
|---|---|---|
| suffix | 生成クラス用に使うサフィックス | .class.php |
| generateBaseClasses | 基底クラスを生成するかどうか | true |
| generateTableClasses | テーブルクラスを生成するかどうか | true |
| baseClassPrefix | 基底クラスに使うプレフィックスの単語 | Base |
| baseClassesDirectory | 基底クラスを生成するディレクトリ | base |
| baseClassName | モデルが継承するスーパークラス | sfDoctrineRecord |
sfDoctrinePluginを利用すれば、設定値を1つ変更するだけで、簡単に使用中のDoctrineのバージョンを切り替えることができます。
たとえば異なるバージョンのDoctrineを使うようにsfDoctrinePluginを設定する方法を以下に示します。
まず、lib/vendor/doctrineで使いたいバージョンのDoctrineをチェックアウトする必要があります。
$ mkdir lib/vendor
$ cd lib/vendor
$ svn co http://svn.doctrine-project.org/branches/1.0.10/lib doctrine
これで、プラグインとしてバンドルされていたバージョンの代わりに、さきほどチェックアウトしたバージョンを設定できます。
次のように、ProjectConfiguration::setup()メソッドとsfConfigで、sfDoctrinePlugin_doctrine_lib_pathの値を変更する必要があります:
public function setup() { sfConfig::set('sfDoctrinePlugin_doctrine_lib_path', sfConfig::get('sf_lib_dir') . '/vendor/doctrine/Doctrine.php'); }
設定に関する詳細はDoctrineの公式マニュアルで見ることができます。
If you find a typo or an error, please register and open a ticket.
If you need support or have a technical question, please post to the official user mailing-list.