yii2 api开发进阶

一、如何实现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)
		}
	})
},

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值