Yii为ActiveRecord订制新方法

如果你的model是继承自CActiveRecord的,那么你可以有很多CActiveRecord的内置方法可以使用,非常方便。但有的时候比如我们想实现一个比较通用的toJson方法,这个时候如果你为每一个model都实现一遍,显然是比较麻烦的,而且很多可重用的代码没有利用起来。这个时候就可以先实现一个类假设叫TActiveRecord,它继承自CActiveRecord,但是覆盖behavior方法。然后model再继承自TActiveRecord,那就可以使用自己定制的behavior方法了。

 

[java][/java] view plaincopyprint?

  1. <pre name=”code” class=”php”>class TActiveRecord extends CActiveRecord{
  2.     public function behaviors() {
  3.        return array(
  4.          ‘IJsonBehavior’=>array(
  5.             ‘class’=>’application.behaviors.IJsonBehavior’
  6.           ),
  7.         );
  8.     }
  9. }</pre>

然后IJsonBehavior类实现如下:

 

 

 

[php][/php] view plaincopyprint?

  1. <?php
  2. class IJsonBehavior extends CBehavior{
  3.     private $owner;
  4.     private $relations;
  5.     public function toJson() {
  6.         $this->owner = $this->getOwner();
  7.         if (is_subclass_of($this->owner,’CActiveRecord’)){
  8.             $attributes = $this->owner->getAttributes();
  9.             return Json::encode($attributes);
  10.         }
  11.         return false;
  12.     }
  13.     public function fromJson($json){
  14.         $this->owner = $this->getOwner();
  15.         if (is_subclass_of($this->owner,’CActiveRecord’)){
  16.             $this->owner->setAttributes(CJSON::decode($json));
  17.             foreach(json_decode($json) as $key=>$val){
  18.                 $this->owner->setAttribute($key,$val);
  19.             }
  20.         }
  21.     }
  22. }

 

将IJsonBehavior放在protected/behavior 文件夹下即可。

 

然后我们再建一个model继承自TActiveRecord

 

[php][/php] view plaincopyprint?

  1. <?php
  2. class TModel extends TActiveRecord
  3. {
  4.     public static function model($className=__CLASS__)
  5.     {
  6.         return parent::model($className);
  7.     }
  8.     public function tableName()
  9.     {
  10.         return ‘tt’;//数据库表名
  11.     }
  12. }

然后TModel就自动有toJson和fromJson方法了. 按照如下方法调用即可:

 

[php][/php] view plaincopyprint?

  1. $model = new TModel;
  2. $json = $model->toJson();

标签