0

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

如果使用 RESTFULL WebServices 完成,那就太好了。如果数据是用JSON编码传输的,太好了!!!...

我很感激你的帮助。谢谢。

4

1 回答 1

1

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

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

Yii 的 EActiveResource

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

暗示:

注意:这仍然是一个 Alpha 版本!该项目最初是草稿,仍在开发中,所以只要没有 1.0 版本,您可能会遇到可能破坏您的代码的更改。查看 CHANGES.md 文件以获取更多信息

由于那里有数千种不同的 REST 服务使用一千种不同的方法,因此调试错误可能很棘手。因此,我为所有主要功能添加了广泛的跟踪,因此您应该始终能够看到每个请求、它使用的方法以及服务如何响应。只需启用 Yii 的跟踪功能并查找类别“ext.EActiveResource”

安装:

  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.) 现在创建一个像这样扩展 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);

希望这可以帮助你

于 2013-04-12T07:33:19.923 回答