一、如何实现id转换为关联表中的字段
重写模型类的fields或extraFields方法,根据需求设置字段以及字段的值,这样,yii\rest\Serializer转换出来的数组就是我们需要的数据了
A、在客户端发送的api请求地址上,通过fields参数来指定需要的字段。
B、我们重写fields方法来指定需要的字段,还可以自定义字段名。
C、在fields方法中,通过匿名函数自定义字段的值。
D、通过重写extrafields这个方法来自定义字段
E、用unset去掉不显示的字段。
F、链接HATEOAS,数据模型中定义getlinks方法
<?php
namespace common\models;
use Yii;
use yii\web\Link;
use yii\web\Linkable;
use yii\helpers\Url;
class Article extends \yii\db\ActiveRecord implements Linkable{
const STATUS_DRAFT = 0;
const STATUS_PUBLISHED =10;
public function fields(){
return[
'id',
'title',
'内容'=>'content',
'status'=>function($model){
return $model->status==self::STATUS_DRAFT?"草稿":'已发布';
},
'createdBy'=>function($model){
return $model->createdBy->realname;
}
]
}
/*另一种方法
$fields = parent::fields();
unset($fields['created_at']);
return $fields;
*/
public function getLinks(){
return[
Link::REL_SELF => Url::to(['article/view','id'=>$this->id],true),
'edit'=>Url::to(['article/update','id'=>$this->id], true), //修改这条链接
'index'=>Url::to(['articles'],true), //这条资源集合的链接
];
}
}
二、如何自定义分页
namespace api\controllers;
use yii\rest\ActiveController;
use yii\data\ActiveDataProvider;
use common\models\Article;
class ArticleController extends ActiveConroller\
{
public $modelClass = 'common\models\Article';
public function actions(){
$actions = parent::actions();
unset($actions['index']);
return $actions;
}
public function actionIndex(){
$modelClass = $this->modelClass;
return new ActiveDataProvider(
[
'query'=>$modelClass::find()->asArray(),
'pagination'=>['pageSize'=>5],
]
)
}
}
三、根据关键字查询文章
服务端:AticleController.php
public function actionSearch(){
return Article::find()->where(['like', 'title', $_POST['keyword']])->all();
}
服务端main.php
'urlManager'=>[
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' =>[
['class' => 'yii\rest\UrlRule',
'controller'= 'article',
'ruleConfig'=>[
'class'=>'yii\web\UrlRule',
'defaults'=>[
'expand'=>'createdBy',
]
],
'extraPatterns'=>[
'POST search' => 'search'
],
]
]
]
客户端:
bindSearchTap: function(){
var page = this;
wx.request({
url: 'http://api.apitpl.dev/articles/search',
header:{
'Content-Type':'application/x-www-form-urlencoded'
},
method: 'POST',
data:{
keyword:'版权'
}
success:function(res.data){
console.log(res.data)
}
})
},
四、如何实现自定义资源来对外提供接口服务
namespace api\controllers;
use yii\rest\Controller;
use common\models\Article;
use yii\db\Query;
class Top10Contrller extends Controller{
public function actionIndex(){
$top10 = (new Query())
->from('article')
->select(['created_by', 'Count(id) as creatercount'])
->groupBy(['created_by'])
->orderBy('creatercount')
->limit(10)
->all();
return $top10;
}
}
配置url规则
'urlManager'=>[
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' =>[
['class' => 'yii\rest\UrlRule',
'controller'= 'article',
'ruleConfig'=>[
'class'=>'yii\web\UrlRule',
'defaults'=>[
'expand'=>'createdBy',
]
],
'extraPatterns'=>[
'POST search' => 'search'
],
['class'=>'yii\rest\UrlRule', //当前配置这段代码
'controller'=>'top10',
'pluralize'=>false, //top10已经代码复数,所以去掉复数形式
'except' =>['delete','create','update','view'], //设置哪些http动词禁用
],
]
]
]
客户端代码
bindTop10Tap: function(){
var page = this;
wx.request({
url: 'http://api.apitpl.dev/top10',
header:{
'Content-Type':'application/json'
},
success:function(res.data){
console.log(res.data)
}
})
},