yii 2 api開発の段階化


一、idを関連テーブルのフィールドに変換する方法
モデルクラスのfieldsメソッドまたはextraFieldsメソッドを書き換え、必要に応じてフィールドとフィールドの値を設定します.これにより、yiirestSerializerが変換した配列が必要なデータになります.
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();
}

サービス・エンド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)
		}
	})
},