symfony Doctrineで複数DB接続の切替

現在Webシステムの開発は、symfony+doctrineで行っていますが、doctrineに関しての情報が少ないので、
ちょっとしたテクニックをご紹介します。

Doctrineはデフォルトで複数DB接続の切替が可能ですが、あらかじめ使用するDBが確定している事が前提です。
ただ、以下のようなケースはちょっと工夫が必要となります。

① 登録ユーザー毎に、DBを分ける
②ユーザー毎のDB定義は同じ。

通常であればDBを切り替える場合、databases.ymlに以下のように記述します。

all:
  user1:  ← 接続名
   ~
  user2:  ← 接続名
   ~

しかし、ユーザー毎のDB定義が同じだと、doctrine:build-modelで作成されるクラス名が
同じになる為、問題となります。また、ユーザーが増える度にコマンドを叩くのは手間
がかかります。

で、どうするかというと

【① デフォルトの接続設定をdatabases.ymlに記述】

all:
  user:  ←各ユーザー用の接続名
    classs: sfDoctrineDatabase
    param:
      dsn: 'mysql:host=localhost;dbname=dummydb'
      username: dummy
      password: dummy

doctrineは、「user」という接続名でDB接続情報を保持しているので、それを再設定
してあげるだけで切り替える事ができます。

【② doctrineの接続再作成処理】

// デフォルトの「user」接続を破棄
  Doctrine_Manager::getInstance()->closeConnection(
      Doctrine_Manager::getInstance()->getConnection('user')
  );

  // ユーザー毎の接続を再作成
  new sfDoctrineDatabase(array(
	'name'=>'user',
	'dsn'=>'mysql:host=localhost;dbname=hogehoge',
	'username'=>'hoge',
	'password'=>'hoge'
  ));

ユーザー毎のDBへとアクセスする前に、上記の処理を追加するだけでDB接続先を切り替える事が出来ます。
毎回上記処理を入れるのは煩雑なので、専用のフィルタを作成すれば簡単です。

※ そういえば、symfony1.3からは、doctrineがメインのORMになるみたいです。
   まだまだ、doctrineの情報はpropelに比べると少ないので増えていけばいいですね。

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL