ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

Modelを全く扱わないControllerの中で明示的にConnectionManager::getDataSource()で "Fatal error: Class‘ConnectionManager’ not found"エラー発生。

ついに根負けしてCakePHPタグを作ってしまった・・・。

えっと、つまり

<?php
class HogeController extends AppController {
    /*
     * デフォルトのfalseだと、"Missing Model"というエラーになる。
     */
    var $uses = array();
}

としていて、そこにindexアクションを追加したわけです。で、手動でSQLを呼びたかったし何よりもgetDataSource()で返されるオブジェクト参照の中身が気になったので、

function index() {
    $db =& ConnectionManager::getDataSource(getenv('CAKE_ENV'));
    var_dump($db);
}

と追加してみたのですよ、奥様。そしたら。

Fatal error: Class 'ConnectionManager' not found in .../hoge_controller.php on line XX

まぁ、そりゃ、DB関係全く呼んでないからそれもそうだよなぁ・・・までは良いのですが。で、どう解決すんの?これ。

まぁ手動でrequire_onceすりゃそれでおしまいなのは当たり前なのですが、いかんせん、フレームワーク側で絶対に何らかの罠、じゃなかったI/Fが用意されている筈なんです。symfonyCakePHPの場合は。で、調べたところ

model_php4.php : 

uses('class_registry', 'validators', 'model' . DS . 'connection_manager', 'set');

という一文が見つかりました。というわけで、uses()の中身も確認した上で、

uses('model' . DS . 'connection_manager');

をindex()の中に仕込んで(近いうちに多分AppControllerに移すと思う)、解決。

で結局、返されるオブジェクトは今回はMySQLを使っていたので DboMysqlでした。つまり、cake/libs/model/dbo/dbo_mysql.php の中のクラスのオブジェクトですね。

・・・疲れた。(;´ρ`)