转载请注明来自souldak,微博:@evagle
如果你的model是继承自CActiveRecord的,那么你可以有很多CActiveRecord的内置方法可以使用,非常方便。但有的时候比如我们想实现一个比较通用的toJson方法,这个时候如果你为每一个model都实现一遍,显然是比较麻烦的,而且很多可重用的代码没有利用起来。这个时候就可以先实现一个类假设叫TActiveRecord,它继承自CActiveRecord,但是覆盖behavior方法。然后model再继承自TActiveRecord,那就可以使用自己定制的behavior方法了。
class TActiveRecord extends CActiveRecord{ public function behaviors() { return array( 'IJsonBehavior'=>array( 'class'=>'application.behaviors.IJsonBehavior' ), ); } }
然后IJsonBehavior类实现如下:
<?php class IJsonBehavior extends CBehavior{ private $owner; private $relations; public function toJson() { $this->owner = $this->getOwner(); if (is_subclass_of($this->owner,'CActiveRecord')){ $attributes = $this->owner->getAttributes(); return Json::encode($attributes); } return false; } public function fromJson($json){ $this->owner = $this->getOwner(); if (is_subclass_of($this->owner,'CActiveRecord')){ $this->owner->setAttributes(CJSON::decode($json)); foreach(json_decode($json) as $key=>$val){ $this->owner->setAttribute($key,$val); } } } }
将IJsonBehavior放在protected/behavior 文件夹下即可。
然后我们再建一个model继承自TActiveRecord
<?php class TModel extends TActiveRecord { public static function model($className=__CLASS__) { return parent::model($className); } public function tableName() { return 'tt';//数据库表名 } }然后TModel就自动有toJson和fromJson方法了. 按照如下方法调用即可:
$model = new TModel; $json = $model->toJson();有不明白的可以评论或者微博@evagle