色々なモデルからデータを読み込んでViewにセットする

「How to build a “dashboard” for your application in CakePHP」という記事
from nuts and bolts of cakephp


TOP画面などで、例えば新着記事一覧とか、コメント一覧とか、色々なモデルから情報を取得して表示するダッシュボード機能を作りたいときの参考記事。


コントローラから複数のモデルを使う場合、$usesでモデルを指定すると、関係ないアクションまでモデルをロードしてしまって非効率なので、

ClassRegistry::init('Post')->getTop()

というように、必要なアクションの中でのみClassRegistryを使ってモデルのインスタンスを取得してメソッドを実行(ここではPostモデルファイルに記載しているgetTopメソッドを実行)しています。


この記事のコメントの中でApp::importじゃだめなの?というのがあって、それでもいいけど、分かりやすいからClassRegistryの方がいいよって言ってる。まぁ、複数モデルを読み込む場合に、それぞれimportしてnewしてとやるよりは、この1行で済ませた方が分かりやすくてよいかも。


ClassRegistryのAPIドキュメント
http://api.cakephp.org/class_class_registry.html


追記
上記の例だと、PostモデルもしくはAppModelに独自に追加したgetTopメソッドを呼び出しているが、普通にfindやPaginationなどのメソッドは使えます。

$result = ClassRegistry::init('Blog')->find('all');

複数のメソッドを呼び出す場合は、initでオブジェクトのインスタンスがreturnされるので

$obj = ClassRegistry::init('Blog');
$result = $obj->find('all');
$result2 = $obj->find('list');

とすればいいです。