RIGHT:&tag(CakePHP);
#contentsx

* CakePHPのモデルをエンティティとして扱う [#mff3243a]
ここでのエンティティとは、モデルで定義されたデータを保持し、そのモデルの振る舞いを持つオブジェクト(実体)のことです。
CakePHPのモデルクラスでは、DBから取得した値は連想配列として返却するのみで、その値自体をモデルが保持しているわけではありません。
従って、モデルとしての振る舞いを実装しようとした時に困ります。

例えば、商品モデルに金額プロパティがあるとします。
そして、商品の税込み金額を返す振る舞いが必要な場合に、下記のように実装したいですね。

 Class Item extends AppModel {
   var $name = 'Item';
 
   function taxOnPrice() {
     return floor($this->price * 1.05);
   }
 }

しかし、DBから取得した値は、Itemオブジェクトのpriceには格納されていません。
そこで、コントローラーとモデルを工夫して、エンティティとして扱えるようにします。

** AppController [#xedba3a1]
AppControllerにエンティティを生成するメソッドを用意します。
app/app_controller.php
 class AppController extends CommonsController
 {
   // エンティティを生成する
   function createEntity($name, $values = array()) {
     $model =& new $name();
     $model->setEntityValues($values);
     return $model;
   }
 }

** AppModel [#f05016c8]
AppModelでモデルクラスをエンティティとして扱うためのメソッドを用意します。
app/app_model.php
 class AppModel extends Model
 {
   // プロパティの値を格納するための変数
   var $entityValues = array();
 
   // プロパティの値を取得
   function g($name) {
     return $this->entityValues[$name];
   }
 
   // プロパティに値をセット
   function s($name, $value) {
     $this->entityValues[$name] = $value;
   }
 
   // 連想配列をプロパティの値として保持する
   function setEntityValues($a = array()) {
     $this->entityValues = $a[$this->name];
   }
 }

** コントローラ側の処理 [#z061be69]
Itemを取得するitems_controller.phpを下記のように実装します。
 class ItemsController extends AppController
 {
   var $name = 'Items';
 
   function index($id) {
     $entity = $this->createEntity('Item', $this->Item->read(null, $id));
     $this->set('item', $entity);
   }
 }
-$this->Item->readでDBから商品情報を取得します。
取得したデータは、連想配列で格納されています。
 Array {
   [price] => 1000
 }
-




** 関連ページ [#zfc12676]
#lsx

#newpage_subdir()

** コメント [#kc510b89]
#comment


    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS