Top > PHP > CakePHP > CakePHPのモデルをエンティティとして扱う

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];
   }
 
   // プロパティの値を連想配列で返します。
   function getEntityValues() {
     return $this->_entityValues;
   }
 
 }
** コントローラ側の処理 [#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
 }
-通常は、この連想配列をビューで使えるように$this->setでセットするのですが、ビュー側では、エンティティとしてデータを扱いたいので、$this->createEntity メソッドを呼び出します。
-createEntity メソッドでは、第1引数で指定されたモデルのインスタンスを生成し、第2引数で指定された連想配列をモデル内に保持し、そのインスタンスを返します。
-戻り値のエンティティを$this->setでセットします。

** ビューでエンティティにアクセスする [#e6f5be39]
-ビューでは、セットされたエンティティを使います。
 <?php echo $item->g('price') ?>
これで、Itemの中のpriceプロパティの値を取得できます。
画面には、1000が表示されます。
-次に、エンティティ内のメソッドを呼び出して税込み金額を表示してみます。
 <?php echo $item->taxOnPrice() ?>
画面には、1050が表示されます。
-エンティティのプロパティに値をセットする場合は、下記のようにします。
 <?php echo $item->s('price', 5000) ?>

** まとめ [#t5c49a3b]
これで、少しだけですが、CakePHPが使いやすくなったと思います。
連想配列を操作するのではなく、エンティティ(モデルクラスの実体)を視覚的に使えるのでソースも見やすくなるでしょう。






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

#newpage_subdir()

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

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