Component

Posted by muchag | CakePHP |
初回投稿:2011-06-19 (日) 17:42:14 | 最終更新:2011-06-29 (水) 19:46:04

同一コントロールであれば、
同コントロール内で繰り返し利用できる独自関数を作成できるけど
別コントロールになるとういうわけにもいかないので
そういうときのために Component が存在する。

The CakePHP 1.3 Book:3.6 コンポーネント

【環境】
[CakePHP] 1.3.10
役割

コントローラ(処理)のパーツとして存在し
コントローラに取り込むことでいつでも利用できる。

よって、コントローラ も参照。

まぁ、普通のクラスと思えばいいのかしら?
 

ファイル名

自由。
全て小文字で単語間は _ (アンダースコア)。
拡張子は、.php
例)book_list.php

クラス名

ファイル名を頭文字大文字で引っ付ける。
例) book_list.php → BookListComponent
 

格納場所
app\controllers\components

 

呼出
コントローラへ登録

コントローラの中のフィールドにて

  1. var $components = array('BookList');

components プロパティを設定。

このとき、app_controller.php 等の親クラスで設定した components プロパティを
上書きしないように注意
 

呼び出し

当該コンポーネントを呼び出したい場所で
一般クラス同様

  1. // プロパティ
  2. $this->(コンポーネント名)->(プロパティ名);
  3.  
  4. // メソッド
  5. $this->(コンポーネント名)->(メソッド名)();

のようにして呼び出す。
 

スケルトン
  1. <?php
  2. // app/controllers/book_list.php
  3. class BookListComponent extends Object
  4. {
  5.     var $name = 'BookList';
  6.  
  7.     // beforeFilter の前に自動的に実行される
  8.     function initialize(&$controller)
  9.     {
  10.     }
  11.  
  12.     // beforeFilter の後に自動的に実行される
  13.     function startup(&$controller)
  14.     {
  15.     }
  16.  
  17.     function show($category, $id)
  18.     {
  19.         /* 処理 */
  20.     }
  21. }&#91;/php]
  22.  
  23. <div class="flow2">継承</div>
  24. コントローラは、<span class="emphasis_r">必ず</span> Object クラスまたはそのサブクラスを継承すること。
  25.  
  26. <div class="flow3">Object クラスを継承する場合</div>
  27. [php]class BookListComponents extends Object

 

Object クラスのサブクラスを継承する場合

この手法を用いると、複数コンポーネントで設定を共有できる

ただし、その場合は、同名のプロパティやメソッドを上書きしてしまうので

cake ディレクトリ\libs\controller\controller.php

を参考に、マージさせる手法を考えなくてはならない場合も出てくる。

参考元サイト:tomstay’s memo CakePHPで独自の共通コントローラを継承させて使用する
 

app\controllers\components\sample.php

を配置した上で

  1. App::import('Component', 'Sample');
  2. class BookListComponent extends SampleComponent

もちろん SampleComponent は Object クラスを継承すること。
 

参照

コンポーネント内でコントローラやモデルを参照する場合は
インスタンス化が必要。
 

コントローラ

initialize メソッド、または startup メソッド内にて実行。

  1. private $controller;
  2.  
  3. // beforeFilter の前に自動的に実行される
  4. public function initialize(&$controller)
  5. {
  6.     $this->controller =& $controller;
  7. }

とマニュアルに書いてあるので書いてみたけど
これが「インスタンス化」かどうかよくわかっていない。
 

利用

今までコントローラで利用してきたコントローラプロパティやメソッドは
コントローラインスタンスを経由して利用する。

  1. // コントローラ名
  2. $this->controller->name;
  3.  
  4. // ビューへ変数を受け渡す
  5. $this->controller->set('hoge', $hoge);
  6.  
  7. // ビューを指定する
  8. $this->controller->render('hoge');

 

モデル

モデルの場合は任意の場所でインスタンス化。

ただし、マニュアルと参考元サイトで大分違うので両方記述。
ちなみに試した結果、どちらも有効であった。

マニュアル
  1. public function hoge()
  2. {
  3.     $userInstance = ClassRegistry::init('User');
  4.     $totalUsers = $userInstance->find('count');
  5. }
参考元サイト
  1. private $M;
  2.  
  3. public function hoge()
  4. {
  5.     $model = $this->controller->modelClass;
  6.     $this->M =& $controller->{$model};
  7. }

 

非推奨

コンポーネント内でモデルを利用することは非推奨なんだそうな。

コンポーネント内でモデルにアクセスする、または使用することは、一般的に推奨されていません。しかしながら、そうすることに重要性がある場合、手動でモデルクラスをインスタンス化して使用する必要があります。次がサンプルになります

The CakePHP 1.3 Book:3.6.3 独自のコンポーネントを作成する
3.6.3.2 コンポーネント内でMVC クラスにアクセスする

ん~、これがどういう意味というか根拠なのかがわからないけど
これだとコンポーネントの利便性が半減するような気がする。

他のサイトでもコンポーネント内でモデルを利用しているので
今回は目を瞑って利用してしまおう・・・。
 

親子

継承関係にない2つのコンポーネント間で親子関係を結ぶことができる。

親としたいコンポーネントのフィールドで
子としたいコンポーネントを components プロパティに登録する。

この際継承関係にあるコントローラやコンポーネントと異なり
$components プロパティは上書きされないようだ。

確認した部分を具体的に挙げると
以下のようにコンポーネント内で $components プロパティを設定しても
コントローラの AuthComponent は無事に稼動していたようなので
コントローラの $components プロパティには影響が無さそうだ。
 

  1. class ParentComponent extends Object
  2. {
  3.     private $name = 'Parent';
  4.     public $components = array(’Child’);
  5.  
  6.     public function initialize(&$controller)
  7.     {
  8.         $this->Child->foo();
  9.     }
  10.  
  11.     public function bar()
  12.     {
  13.         // ...
  14.     }
  15. }

 

  1. class ChildComponent extends Object
  2. {
  3.     private $name = 'Child';
  4.  
  5.     public function initialize(&$controller)
  6.     {
  7.         $this->Parent->bar();
  8.     }
  9.  
  10.     public function foo()
  11.     {
  12.         // ...
  13.     }
  14. }
Posted by muchag | CakePHP |
初回投稿:2011-06-19 (日) 17:42:14 | 最終更新:2011-06-29 (水) 19:46:04

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment