requestAction() じゃなくてcompornentを使う


どんなサイトでもたいていの場合 同じことが繰り返し表示される部分があります
そのソースを毎回書くのじゃなく、どっかに書いてそれを再利用しましょう
ということを考えるわけですが、
それのcakePHPでの解決方法を考えて見ます。(浅い知識で)

cakePHPでそれを解決する方法が
ぱっと2個あります。
(AppContoller に書くなんてこともあるので3つか。。)

1:requestAction() を使う

簡単に言えば別のコントローラのfunctionにタッチできますよということらしいです。
でもこれ、private functionはできない( _ で始まる名前のfunction)とのこと。

これって要は 外からURLぶったたいた結果を持ってきますよーってことみたいです。

なんとなく強引なイメージがありますね。
そもそも画面の一部分だけを 外でたたけちゃうのはいやだし。

2:compornent を使う

それで他にないのかなーと探してました。
できればパーツ専用のコントローラを作ってそれを $this->** みたいに読み出すような形にしたかった。
*けど Appcontoroller には書きたくないし。。。

と思ってたら compornent というものを発見しました。

「目標は再利用性(reusability)です。」
URL:http://cakephp.jp/doc/components.html

おおお KOREDA!

ということで以下使い方メモ
(といっても簡単です。)

構成的に
・TOP画面 (top_contoroller.php)
・TOPの中にプロフィールを常に表示するパーツ(parts.php)

という感じのイメージです。

1:まず適当にコントローラを作る(top_contoroller.php)

適当に

Class TopController
{
     //DB接続
     var $uses = array(‘ここで使うモデルたくさん’,’パーツで使うモデルたくさん’);
     //Compornent接続
     var $components = array(‘Parts’,’パーツPHPのクラス名’);

     function index()
     {
          //適当にset
          $this->set(‘title’,”とっぷぺーじ”);

          //Compornentからのデータをセット
          $this->set(“profile”,$this->Parts->パーツのメソッド());
     }
}

とします。

ここで注意点
・この時点で $uses にパーツで使うのに必要なモデルも呼び出しておくこと

・パーツへのアクセスは

     var $components = array(‘Parts’,’パーツPHPのクラス名’);

ここでやります。
これは /app/controller/compornent/ にある parts.php を見に行って
Partsクラスを呼び出します。

で最後そのメソッドを使用するには

     $this->Parts->パーツのメソッド();

こんなかんじです。

2:コンポーネントを作る(/app/controller/compornent/parts.php)

/app/controller/compornent/ に parts.phpを作って
ごりごり書けばOK。

といってもとりあえず書き方にちょっとこつがあったので、書いておきます。
これもしかしたら普通にAppControllerを継承すればいいだけかも?

Class PartsComponent extends Object
{
     var $Controller;

     function startup(&$controller)
     {
          $this->Controller =& $controller;
     }

     function profile()
     {
          //プロフィール出力処理
          return $this->Controller->モデル名->read();みたいな
     }

・・以下ごりごり

まずファイル名に対応するクラスを作ります(他のコントローラみたいに)
で語尾がCompornent。

次に appcontrollerを継承するのじゃなくなぜか、Objectを継承します。
理由とか不明w(時間あったら調べます。。。)

で、最初の

function startup(&$controller)
{
     $this->Controller =& $controller;
}

ここで呼び出し元controllerを参照してそのモデルとかを持ってきます。
要はコントローラ<>コンポーネントでの中継部分かな。
これでcompornentファイルでcontrollerと同じようにごりごりかける設定が終了。

あとは書くだけですが、一応モデルへのアクセスは

     //これじゃだめ
     $this->モデル名->read();

     //こう書く
     $this->Controller->モデル名->read();

これでパーツだけ別ファイルに切り出して管理も楽だし、
追加とかも楽 なハズ?

他にもやり方あったら教えてください!


Leave a Reply