テーブルとオブジェクトの間にアダプターをかませる

Zend Framework でO/Rマッパーを使っていると、テーブルのカラム名とオブジェクトのプロパティ名を1対1にしたくことが多々あります(テーブルの構造だけ案件ごとに差し替えとか)。エンティティに1枚皮をかぶせられないかなぁ・・・と思って、Zend Framework のソースを読んでいたら、_rowClass を書き換えると簡単に実現できることがわかりました。痒いところに手が届く感じで、Zend Framework がまたちょっと好きになりました。

ちなみに _rowsetClass を書き換えると行クラスも差し替えられます。あまり使う機会はなさそうですが。

Dao/Users.php

テーブルクラスです。

<?php
class Dao_Users extends Zend_Db_Table_Abstract {
    protected $_name     = 'users';
    protected $_primary  = 'id';
    protected $_rowClass = 'Dao_Row_Users';
}

Dao/Row/Users.php

データクラスです。

<?php
class Dao_Row_Users extends Zend_Db_Table_Row {
    public function primary() {
        return $this->id;
    }

    public function fullname() {
        return $this->name1 . ' ' . $this->name2;
    }

    public function toArray() {
        return array(
            'primary'  => $this->primary(),
            'fullname' => $this->fullname()
        );
    }
}

使用例

$table = new Dao_Users();
$model = $table->find(12345)->current();
print_r($model->toArray());