このところCakePHPに翻弄され続けているのではまったことをメモっておくことにします。
今日は、「データベーステーブルがありません」について
例えば、password再設定用のコントローラーを作っていて、コントローラーからMemberモデルを使うよ。という場合。
class PasswordController extends AppController {
var $name = 'Password';
var $uses = array('Member');
}
こんな風にして、CakePHPの命名規則に沿わないコントローラーとモデルの組み合わせが指定できます。
なのに、/passwordにアクセスすると、「データベーステーブルがありません」が表示されて、「えっ」という状況。
なんでだろうと思っていたら、Memberモデルはどこでも使う設計にしてたのでAppControllerに
class AppController extends Controller {
var $uses = array('Member');
}
なんて、書いてたんですね。
こうしておくと$usesの値をControllerでごにょごにょしてマージしたりする(Controllerの__mergeVarsメソッド)ときに、PasswordControllerとAppControllerの$usesが同じ、かつ空じゃない場合は、CakePHPの命名規則でモデルをロードしてしまいます。(Cake1.2.5のcake/libs/controller/Controller.php L:379)
すると、PasswordControllerには
class PasswordController extends AppController {
var $name = 'Password';
var $uses = array('Password', 'Member');
}
と書いたのと同じになってしまうのです。
よって、AppControllerの$uses以外使わないようにするには
class PasswordController extends AppController {
var $name = 'Password';
var $uses = array(); // falseだとAppControllerの$uses無視しちゃうよ
}
とする必要があります。
こういうのって、ついウッカリ忘れそうなのでメモしておきます。