スポンサード リンク
Top > PHP > CakePHP > CakePHPのモデルをエンティティとして扱う
スポンサード リンク

Tag: CakePHP

CakePHPのモデルをエンティティとして扱う Edit

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

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

Class Item extends AppModel {
  var $name = 'Item';

  function taxOnPrice() {
    return floor($this->price * 1.05);
  }
}

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

AppController Edit

AppControllerにエンティティを生成するメソッドを用意します。
app/app_controller.php

class AppController extends CommonsController
{
  // エンティティを生成する
  function createEntity($name, $values = array()) {
    $model =& new $name();
    $model->setEntityValues($values);
    return $model;
  }
}

AppModel Edit

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;
  }

}

コントローラ側の処理 Edit

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でセットします。

ビューでエンティティにアクセスする Edit

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

まとめ Edit

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

関連ページ Edit

ページ新規作成:

コメント Edit


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

スポンサード リンク

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2007-02-08 (木) 19:17:05 (4268d)