代码结构总结(1)
代码结构场景
1.调用多个第三方的接口,比如调用微信、微信视频号、小红书接口等
整体结构如下图
说明:
- open目录放 对外对接的平台
- open/weixin目录为微信平台
- open/weixin/channels为微信视频号
- open/weixin/channels/api为微信视频号的各类接口
其它目录依次类推,不做具体业务逻辑。OpenBase.php为抽象类,ChannelsBase.php 继承OpenBase.php并实现具体的方法,api目录下的所有类继承ChannelsBase.php,ChannelsBase.php主要做参数配置、token处理、写入请求日志等等。具体业务逻辑在service中处理,代码目录结构类似。
好处
1.代码结构清晰,方便管理代码
代码片段
1.OpenBase.php
<?php
/**
* 第三方开放接口基类
*/
namespace common\open;
use Yii;
use yii\base\Component;
use common\exceptions\SystemException;
abstract class OpenBase extends Component
{
/**
* 创建对象
* @param string $name 要创建的对象的类名
* @param bool $isSingle 单例模式
* @return static
*/
public static function createObject($name = '', $isSingle = true)
{
if (empty($name)) {
$name = static::class;
}
if ($isSingle && !Yii::$container->hasSingleton($name)) {
Yii::$container->setSingleton($name);
}
return Yii::createObject($name);
}
/**
* GET请求方法
* @param string $path 接口路径
* @param array $queryParams 请求参数
* @param array $headers 请求头
* @param array $options 请求选项
* @return array
* @throws SystemException
*/
public function get(
string $path,
array $queryParams = [],
array $headers = [],
array $options = []
) {
return $this->request('get', $path, $queryParams, [], $headers, $options);
}
/**
* POST 请求方法
* @param string $path 接口路径
* @param array $bodyParams 请求参数
* @param array $queryParams 请求参数
* @param array $headers 请求头
* @param array $options 请求选项
* @return array
* @throws SystemException
*/
public function post(
string $path,
array $bodyParams = [],
array $queryParams = [],
array $headers = [],
array $options = []
) {
return $this->request('post', $path, $queryParams, $bodyParams, $headers, $options);
}
/**
* 请求方法
* @param string $method 请求方法
* @param string $path 接口路径
* @param array $queryParams 请求参数
* @param array $bodyParams 请求参数
* @param array $headers 请求头
* @param array $options 请求选项
* @return array
* @throws SystemException
*/
abstract protected function request($method, $apiMethod, $queryParams = [], $bodyParams = [], $headers = [], $options = []);
}
此处的单例可以减少对象创建。static::class 知识点可参考:
https://learnku.com/articles/74554
2.GoodsApi.php
<?php
namespace common\open\weixin\channels\api;
use common\exceptions\SystemException;
use Yii;
use common\open\weixin\channels\ChannelsBase;
class GoodsApi extends ChannelsBase
{
/** 图片上传 */
const API_UPLOAD_IMG = 'basics/img/upload';
/** 商品上传 */
const API_UPLOAD_GOODS = 'product/add';
/** 生效的品牌列表 */
const API_VALID_BRAND = 'brand/valid/list/get';
/** 获取所有的类目 */
const API_ALL_CATEGORY = 'category/all';
/** 获取类目信息 */
const API_ONE_CATEGORY = 'category/detail';
/** 可用类目 */
const API_VALID_CATEGORY = 'category/availablesoncategories/get';
/** 运费模板列表*/
const API_FREIGHT_TEMPLATE_LIST = 'merchant/getfreighttemplatelist';
/** 运费模板详情 */
const API_FREIGHT_TEMPLATE_DETAIL = 'merchant/getfreighttemplatedetail';
const API_ADDRESS = 'merchant/address/list';
const API_ADDRESS_DETAIL = 'merchant/address/get';
/**
* @desc:图片上传
* @see:https://developers.weixin.qq.com/doc/channels/API/basics/img_upload.html
* @param array $bodyParams
* @param array $queryParams
* @return array
* @throws SystemException
*/
public static function uploadImg(array $bodyParams, array $queryParams=[]): array
{
$res = self::createObject()->post(self::API_UPLOAD_IMG, $bodyParams,$queryParams);
return $res['pic_file'] ?? '';
}