CakePHP で AppController から AppModel のメソッドにアクセスすることは難しい

AppController から AppModel にという考え方は結構おかしいというか珍しいようで、日本語で情報を探すあたり1件しか情報がありませんでした。悩んだ挙句、実際はそんなことしなくても例えばコンポーネントを使ったり、それ専用のモデルを作って、App::import で読み込んだりすると良いかもということが分かりましたよー。3時間くらい悩みました。

今回のこれらの件について @endo55 さんにかなりアドバイスいただきました。

それ専用のモデルを作って、App::import で読み込んだりする

私の考えた間違ったエレメントの使い方

今回私はエレメントですべてのページで読み込む新着投稿一覧のようなモノを作り、全ページで読み込ませようと考えていました。
新着一覧を生成するにあたって、以下の手順を考えました。(以下の手順は実現不可能です。)

  1. 新着記事一覧を表示するためのエレメント recent.thtml を作成。
  2. AppModel に新着記事一覧を生成するメソッド recent() を作成。
  3. AppController::beforeFilter() で $this->AppModel->recent() で新着記事一覧を取得し view へ新着記事一覧を加工し変数として渡す。
  4. view で echo $this->renderElement(‘hoge’, array(‘fuga’ => $piyo)) などとして、新着記事一覧をさらにエレメントに渡す。
  5. エレメントが新着記事一覧を受け取りそれを出力する。

どこにいても常に新着記事一覧を生成しなければいけません。そのため、AppConroller::beforeFilter() で毎回処理を実行しようと思ったんですが、$this->AppModel->recent() では AppModel のメソッドにアクセスできませんでした。いろいろ情報を探しましたが、無理みたいです…。

そもそも、変数がビューからエレメントに渡されているのは無駄な気がしました。また、せっかくエレメントではキャッシュを取れるのですが、もしかするとこの方法だとキャッシュ取っても処理だけは実行されてしまうような気がします。まだ実際にやったことないので詳しいことは分かりませんが。

なんかエレメントを正しく使ってる感じがする方法

以上で紹介した私のやりたいことは、以下の方法で実現することが可能です。また、無駄な処理もカットでき、本来あるべき姿のエレメントの形になったのではないでしょうか。

  1. 新着記事一覧を生成するモデル Recent を作成。
  2. エレメント内で App::import(‘Model’,’recent’) としてモデルを読み込む。
  3. エレメント内で recent() メソッドから直接結果を受け取りその場で出力を行います。

エレメント内でモデルを読み込むところは以下のような処理ですね。
エレメント内でオブジェクトを生成します。

1
2
3
App::import('Model','recent');
$recent = new Recent();
$data = $recent->recent();

こうした方が、無駄が省けていますし、管理も楽ではないかと思います。また、キャッシュ機能を問題なく使えそうなため、実用的なのではないでしょうか。間違っていたらご指摘いただければと思いますです。

コメント

コメントは受け付けていません。