Yii为ActiveRecord订制新方法

来源:互联网 发布:serverless 阿里云 编辑:程序博客网 时间:2024/04/27 23:32

转载请注明来自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类实现如下:

<?phpclass 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

<?phpclass 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

原创粉丝点击