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

コントローラ側の処理 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
    }

関連ページ Edit

ページ新規作成:

コメント Edit


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

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