日記
Zend_Db_Tableにシリアライズしたデータを格納する方法 その2Edit

外部から解決する方法をいろいろ試してみたけれど、結局きれいに対応するのは無理っぽい。っつーか外部からの対応だと、不完全な方法しか思いつかね。

ってことで、直接Zend_Db_Table_Rowを書き換える汚い方法で対処してみた。

class Zend_Db_Table_Row
{
public function __construct($config)
{
....
} else {
$this->_data = (array) $config['data'];
if (is_callable(array($this->_table, 'fetchCallback'))) {
$this->_table->fetchCallback($this->_data);
}
}
}
}

なんてものを追加してしまう。すると、データ付きのRowが生成されるときに、そのZend_Db_TableオブジェクトにfetchCallbackというメソッドがあれば、データハッシュを引数にしてそのメソッドを呼び出す。そうしておけば、

class Foo extends Zend_Db_Table
{
public function insert(&data)
{
$data['bar'] = serialize($data['bar']);
return parent::insert($data);
}
// updateも同様
public function fetchCallback(&$data)
{
$data['bar'] = unserialize($data['bar']);
}
}

なんて感じで、読み書きでの自動シリアライズ、アンシリアライズを書けるようになる。ひとまずしばらくこれでごまかしておこう。2行の追加程度ならば、Zend Frameworkのバージョンアップ時の追随もそれほどつらくないだろうし。

Published At2006-05-26 00:00Updated At2006-05-26 00:00