Yii框架:使用Web服务复制ActiveRecord功能的模型

时间:2012-09-20 09:10:44

标签: yii

有没有人尝试过或找到一个从CModel派生的类的示例,它使用WebServices而不是数据库连接复制CActiveRecord功能?

如果使用RESTFULL WebServices完成它会很棒。如果数据传输JSON编码,很棒!! ...

我会帮助你。感谢。

1 个答案:

答案 0 :(得分:1)

我花了很多时间寻找它,我在Github上遇到了这个Yii扩展: https://github.com/Haensel/ActiveResource

它允许您准确地找到您要查找的内容,自述文件未使用changes.md 中反映的更改进行更新,因此我建议您仔细阅读本文档。

Yii的EActiveResource

...是Yii PHP框架的扩展,允许用户创建使用RESTful服务作为持久存储的模型。 该实现的灵感来自Yii的CActiveRecord类和ActiveResource(http://api.rubyonrails.org/classes/ActiveResource/Base.html)的Ruby on Rails实现。

提示:

注意:这仍然是ALPHA释放! 这个项目是作为草案开始的,目前仍处于开发阶段,因此只要没有1.0版本,您可能会遇到可能会破坏代码的更改。查看CHANGES.md文件以获取更多信息

由于有数千种不同的REST服务使用了数千种不同的方法,因此调试错误可能会非常棘手。因此我增加了广泛的内容 跟踪所有主要功能,因此您应始终能够查看每个请求,使用的方法以及服务的响应方式。只需启用Yii的跟踪功能 并查找“ext.EActiveResource”类别

INSTALL:

  1. 通过将扩展名放在应用程序的扩展名文件夹中(例如'/ protected / extensions')将扩展名添加到Yii
  2. 编辑应用程序main.php配置文件,并将“application.extensions.EActiveResource。*”添加到导入定义中
  3. 将资源配置添加到主配置

        'activeresource'=>array(
            'class'=>'EActiveResourceConnection',
            'site'=>'http://api.aRESTservice.com',
            'contentType'=>'application/json',
            'acceptType'=>'application/json',
        )),
        'queryCacheId'=>'SomeCacheComponent')
    
  4. 4。)现在创建一个扩展EActiveResource的类(不要忘记model()函数!):

    快速概述:

     class Person extends EActiveResource
     {
     /* The id that uniquely identifies a person. This attribute is not defined as a property      
      * because we don't want to send it back to the service like a name, surname or gender etc.
      */
     public $id;
    
     public static function model($className=__CLASS__)
     {
         return parent::model($className);
     }
    
     public function rest()
     {
         return CMap::mergeArray(
            parent::rest(),
            array(
                'resource'=>'people',
            )
         );
     }
    
     /* Let's define some properties and their datatypes
     public function properties()
     {
         return array(
             'name'=>array('type'=>'string'),
             'surname'=>array('type'=>'string'),
             'gender'=>array('type'=>'string'),
             'age'=>array('type'=>'integer'),
             'married'=>array('type'=>'boolean'),
             'salary'=>array('type'=>'double'),
         );
     }
    
     /* Define rules as usual */
     public function rules()
     {
         return array(
             array('name,surname,gender,age,married,salary','safe'),
             array('age','numerical','integerOnly'=>true),
             array('married','boolean'),
             array('salary','numerical')
         );
     }
    
     /* Add some custom labels for forms etc. */
     public function attributeLabels()
     {
         return array(
             'name'=>'First name',
             'surname'=>'Last name',
             'salary'=>'Your monthly salary',
         );
     }
    

    }

    用法:

    /* sends GET to http://api.example.com/person/1 and populates a single Person model*/
    $person=Person::model()->findById(1);
    
    /* sends GET to http://api.example.com/person and populates Person models with the response */
    $persons=Person::model()->findAll();
    
    /* create a resource
    $person=new Person;
    $person->name='A name';
    $person->age=21;
    $person->save(); //New resource, send POST request. Returns false if the model doesn't validate
    
    /* Updating a resource (sending a PUT request)
    $person=Person::model()->findById(1);
    $person->name='Another name';
    $person->save(); //Not at new resource, update it. Returns false if the model doesn't validate
    
    //or short version
    Person::model()->updateById(1,array('name'=>'Another name'));
    
    /* DELETE a resource
    $person=Person::model()->findById(1);
    $person->destroy(); //DELETE to http://api.example.com/person/1
    
    //or short version
    Person::model()->deleteById(1);
    

    希望这有助于你