Yii2 REST创建字段()

时间:2015-07-27 21:11:56

标签: api rest yii2

假设我设置了以下API:

控制器:

<?php
namespace app\modules\v1\controllers;

use yii;

class ResourceController extends \yii\rest\ActiveController
{
    public $modelClass = 'app\modules\v1\models\Resource';
}

型号:     

use yii;

class Resource extends \yii\db\ActiveRecord
{

    public static function tableName()
    {
        return 'ResourceTable';
    }

    public function fields()
    {
        return [
            'id' => 'ResourceID',
            'title' => 'ResourceTitle',
        ];
    }
}

我的表只有两列,ResourceIDTitle

当我在API上尝试GET请求时,它工作正常并返回带有别名字段名称的资源列表(或resource/{id}的单个资源)。但是当我尝试POST创建资源时,我想使用别名字段名称(例如title而不是ResourceTitle)。问题是Yii提供的默认CreateAction执行$model->load(),它在表中查找字段名称。如果我使用别名,那么它会返回错误。如果我使用表字段名称,它可以正常工作。

所以我的问题是,有没有办法向最终用户公开资源属性,其中字段名称(使用fields()函数)与读取和创建相同?如果可能的话,我想避免编写自己的CreateAction。

2 个答案:

答案 0 :(得分:1)

您可以为别名创建getter / setter。

public function getTitle(){ return $this->ResourceTitle; }
public function setTitle($val){ $this->ResourceTitle = $val ; }

答案 1 :(得分:1)

如果你想要$ model-load()保存参数,有必要为新的虚拟属性添加规则

class OrganizationBranch extends BaseOrganization{

public function rules()
    {
        return array_replace_recursive(parent::rules(),
        [
            [['organizationId', 'cityId'], 'safe'],
        ]);
    }

    public function fields() {
        return ['id', 
                'cityId' => 'city_id',
                'organizationId' => 'organization_id', 
                'address', 
                'phoneNumbers' => 'phone_numbers', 
                'schedule', 
                'latitude',         
                'longitude',
        ];
    }

    public function extraFields() {
        return ['branchType', 'city'];
    }

    public function getOrganizationId() {
        return $this->organization_id;
    }

    public function setOrganizationId($val) {
        $this->organization_id = $val;
    }

    public function getCityId() {
        return $this->city_id;
    }

    public function setCityId($val) {
        $this->city_id = $val;
    }

}