スポンサード リンク
CakePHPのモデルをエンティティとして扱う 
ここでのエンティティとは、モデルで定義されたデータを保持し、そのモデルの振る舞いを持つオブジェクト(実体)のことです。
CakePHPのモデルクラスでは、DBから取得した値は連想配列として返却するのみで、その値自体をモデルが保持しているわけではありません。
従って、モデルとしての振る舞いを実装しようとした時に困ります。
例えば、商品モデルに金額プロパティがあるとします。
そして、商品の税込み金額を返す振る舞いが必要な場合に、下記のように実装したいですね。
Class Item extends AppModel {
var $name = 'Item';
function taxOnPrice() {
return floor($this->price * 1.05);
}
}
しかし、DBから取得した値は、Itemオブジェクトのpriceには格納されていません。
そこで、コントローラーとモデルを工夫して、エンティティとして扱えるようにします。
AppController 
AppControllerにエンティティを生成するメソッドを用意します。
app/app_controller.php
class AppController extends CommonsController
{
// エンティティを生成する
function createEntity($name, $values = array()) {
$model =& new $name();
$model->setEntityValues($values);
return $model;
}
}
AppModel 
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;
}
}
コントローラ側の処理 
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);
}
}
ビューでエンティティにアクセスする 
- ビューでは、セットされたエンティティを使います。
<?php echo $item->g('price') ?>
これで、Itemの中のpriceプロパティの値を取得できます。
画面には、1000が表示されます。
- 次に、エンティティ内のメソッドを呼び出して税込み金額を表示してみます。
<?php echo $item->taxOnPrice() ?>
画面には、1050が表示されます。
- エンティティのプロパティに値をセットする場合は、下記のようにします。
<?php echo $item->s('price', 5000) ?>
まとめ 
これで、少しだけですが、CakePHPが使いやすくなったと思います。
連想配列を操作するのではなく、エンティティ(モデルクラスの実体)を視覚的に使えるのでソースも見やすくなるでしょう。
関連ページ 
コメント 
スポンサード リンク