yii2 api开发进阶

一、如何实现id转换为关联表中的字段

重写模型类的fields或extraFields方法,根据需求设置字段以及字段的值,这样,yii\rest\Serializer转换出来的数组就是我们需要的数据了

A、在客户端发送的api请求地址上,通过fields参数来指定需要的字段。
B、我们重写fields方法来指定需要的字段,还可以自定义字段名。
C、在fields方法中,通过匿名函数自定义字段的值。
D、通过重写extrafields这个方法来自定义字段

E、用unset去掉不显示的字段。

F、链接HATEOAS,数据模型中定义getlinks方法

'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)
		}
	})
},

 

你可能感兴趣的:(电脑系统)