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

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

モデルを使わないコントローラ再考

$usesにばしばし追加してください。逆にモデルを使いたくない場合は

class PostController extends AppController{
public $uses = null;

cakePHP モデルなしのコントローラーって作れないの? - WEBぷろぐらま〜 システム開発エトセトラ

・・・えっ 空配列じゃないの? Σ(´酈`lll)

「column DBテーブルを使わない場合にも使えますか?」(「CakePHP ガイドブック」(マイコミ), 141P, 初版第一刷)

CakePHPは、DBテーブルを使わない場合でも問題なく使用できます。
...
2. コントローラー内で設定する場合
 コントローラーに、var $uses = array(); と書くと、このコントローラーはモデルを読み込まなくなりますので、モデルファイル自体を作成する必要がなくなります。
...

で、気になってソースをあさってみました。以前自分が遭遇したのは、$usesをデフォルトのfalseのままにした結果「Missing Model」エラーが表示された現象です。そこを手がかりにGrepしてみると、(あ、例によりバージョンは1.1.19です)
cake/libs/error.php:

<?php
...
/**
 * Renders the Missing Model class web page.
 *
 * @param unknown_type $params
 */
	function missingModel($params) {
...

というのが見つかりました。この中で実際に"Missing Model"という文字列を設定してエラー画面をレンダリングしているようです。ということはこの関数を呼んでいる場所は・・・ということでcontroller.phpgrep

二カ所見つかりました。一カ所は$usesが真の時に、何段かif文がネストした先で呼ばれています。今回は$usesがfalseかnullかでどう変わるかなので、ここはスルーして良いでしょう。もう一カ所がビンゴです。
cake/libs/controller/controller.php:

<?php
...
if (class_exists($this->modelClass) && ($this->uses === false)) {
    ...
    return true;
} elseif ($this->uses === false) {
    return $this->cakeError('missingModel', 
        array(array('className' => $this->modelClass, 'webroot' => '', 'base' => $this->base)));
}

うーん、ここですね。で、なんでfalseだとMissingModelになってnullだとならないかも分かりました。三重等号で比較しているため、型チェックが発生しているからですね。

以上。