CakePHPでコントローラーから同名のモデルを呼び出せない時にチェックすべき事


Angel Food Cake with Lemon Glaze and Strawberries
CakePHPでコントローラからモデルを呼び出そうとした時に「そんな関数ないよ!」と怒られて小一時間悩んだ話。

例えばHogeという名前(HogeをInflector::rulesで複数形と指定済み)のコントローラとモデルがあった場合、コントローラからモデルのfugaアクション(メソッド)を呼び出す時は
$this->Hoge->fuga();
と特にややこしいこともせずに上記のようにすれば呼び出せるんだけど、この前Fatal Error Error: Call to a member function fuga() on a non-object というエラーが出てしまった。

モデル名も間違ってないし、他に原因らしきところも見つからないし困った…と悩む。

このコントローラーで他のモデルを使っていたのでその部分をチェックすると、原因は public $uses だったということが判明。他のモデルをコントローラーで使用する際に$uses に使用するモデル名を指定する必要があるんだけど、その中に自身のモデル名Hogeを指定し忘れていた。他のモデル名はちゃんと指定していたのにね。

この事はクックブックの Controller::$uses Controllers — CakePHP Cookbook v2.x documentation” にも”must also be included”と強い表現で書かれているんですが忘れてました。

Controller::$uses
Controllers have access to their primary model available by default. Our RecipesController will have the Recipe model class available at $this->Recipe, and our ProductsController also features the Product model at $this->Product. However, when allowing a controller to access additional models through the $uses variable, the name of the current controller’s model must also be included. This is illustrated in the example below.

そもそもの原因は一番の原因は$usesを他のコントローラーからコピペしたことなんですが。
別のコントローラーで動いていたからコピペしたコードは大丈夫だろと思っていると原因の特定が遅れるので注意。


CakePHP2 実践入門 (WEB+DB PRESS plus)