どんなサイトでもたいていの場合 同じことが繰り返し表示される部分があります
そのソースを毎回書くのじゃなく、どっかに書いてそれを再利用しましょう
ということを考えるわけですが、
それの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();
これでパーツだけ別ファイルに切り出して管理も楽だし、
追加とかも楽 なハズ?
他にもやり方あったら教えてください!