cakephpのModel::setDataSource()メソッドについて

September 6, 2012,
tags: cakephp php


このエントリーをはてなブックマークに追加

仕事で本来接続されるはずのないデータベースにcakePHPで作られたアプリからデータベースに接続来るなんともキモい現象が発生していました。 よく、アプリの接続先を本番環境と開発環境で切り分けたいとか、このサーバからはこのDBにしか接続したくないってときは、よくモデルのコンストラクタに以下のコードを書いて対応していることが多いかと思います。

class AppModel extends Model
{
...
  public function __construct($id = false, $table = null, $ds = null) {
    $appEnv = env('APP_ENV');
    if (!empty($appEnv)) {
      $this->useDbConfig = $appEnv;
    }
    parent::__construct( $id, $table, $ds );
  }
}

だいたいこんな形が多いかと思います。
これだと何の問題もなかったんですが、垂直の分割とかも考えてもう少しいろいろと実装変えたコードにて、本来モデルの$this->useDbConfig変数の値を変更すればいいところを、setDataSource()メソッドつかって変更しているコードがありました。
該当のコードとしては、実装コードとは違いますが以下のような形になります。

class AppModel extends Model
{
...
  public function __construct($id = false, $table = null, $ds = null) {
    $appEnv = env('APP_ENV');
    if (!empty($appEnv)) {
      $this->setDataSource($appEnv);
    }
    parent::__construct( $id, $table, $ds );
  }
}

ただ、このModel::setDataSource()メソッドってのはなんとなく「useDbConfig」変数の値を変更するだけだと勝手に思っていましたが、コードみてみたら違ってましたね。。。

めっちゃ接続してます・・・すごく接続してます。。。

$oldDb = ConnectionManager::getDataSource($oldConfig);

ということで、Model::setDataSource()メソッドは接続先変えるために使っては行けないかと思います。
むしろ誰かModel::setDataSource()の使いどころ教えてくださいw

まあ今回のトラブルは実装コードに原因があった訳ですが、それ以外にも本来なら接続させないようにdb側も設定するべきだったところを設定しないようにしてたのもトラブルに気づくまでに時間がかかってしまった原因だと思うので、そこらへんもちゃんと気をつけなければだと思いました。

めっちゃ反省してます…ごめんなさい…

comments powered by Disqus