假设我设置了以下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',
];
}
}
我的表只有两列,ResourceID
和Title
。
当我在API上尝试GET
请求时,它工作正常并返回带有别名字段名称的资源列表(或resource/{id}
的单个资源)。但是当我尝试POST
创建资源时,我想使用别名字段名称(例如title
而不是ResourceTitle
)。问题是Yii提供的默认CreateAction
执行$model->load()
,它在表中查找字段名称。如果我使用别名,那么它会返回错误。如果我使用表字段名称,它可以正常工作。
所以我的问题是,有没有办法向最终用户公开资源属性,其中字段名称(使用fields()
函数)与读取和创建相同?如果可能的话,我想避免编写自己的CreateAction。
答案 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;
}
}