要求为:1、多个分省对外暴露统一接口。2、统一请求、响应参数。
订购部分代码架构设计为:
app ├─service │ └─province │ ├─ GD # 广东代码 │ │ ├─ ApiClient.php # 广东专属接口调用类 │ │ └─ BusinessLogic.php # 广东业务逻辑类 │ ├─ HN # 其他省份代码 │ │ └─略 │ └─ HandlerFactory.php # 省份路由工厂 │ └─ BaseService.php # 抽象基类(约束) │ └─ controller └─ Gateway.php # 统一入口控制器
统一入口控制器:
<?php
namespace app\api\controller;
use app\api\service\province\HandlerFactory;
use app\api\service\province\BaseService;
use think\Request;
class Gateway
{
public function getCode(Request $request)
{
// $input=$request->param();
$requestData = [
'mobile' => '13800000000',
'operator_code' => 'gd_telecom',
];
$service = HandlerFactory::create($requestData['operator_code']);
$responseData = $service->getCode($requestData);
return json($responseData);
}
}
工厂类,通过编码路由到分省控制器:
<?php
namespace app\api\service\province;
use think\exception\ClassNotFoundException;
use app\api\service\province\BaseService;
class HandlerFactory
{
/**
* 根据运营商编码路由到对应省份处理器
* @param string $operatorCode 运营商编码(如:gd_telecom)
* @return BaseService
*/
public static function create(string $operatorCode): BaseService
{
// 解析省份代码(示例:gd_telecom → gd)
$provinceCode = explode('_', $operatorCode)[0];
$className = "app\\api\\service\\province\\" . ucfirst($provinceCode) . "\\BusinessLogic";
if (!class_exists($className)) {
throw new ClassNotFoundException('未找到对应省份处理器', $className);
}
// 通过容器自动注入依赖
return app()->make($className);
}
}
抽象类,用于约束子类:
<?php
namespace app\api\service\province;
abstract class BaseService
{
/**
* 强制要求子类实现
* @param array $requestData 统一请求格式
* @return array 必须返回统一响应格式
*/
abstract public function getCode(array $requestData): array;
// /**
// * desc:前置校验
// */
// abstract public function checkQualifications($params):array;
// // 校验验证码
// abstract public function checkCode($params):array;
// /**
// * desc: 办理接口
// * @return array
// */
// abstract public function handle($params):array;
// // 查询订单
// abstract public function queryOrder($params):array;
}
分省业务逻辑类,要继承抽象类:
<?PHP
namespace app\api\service\province\GD;
use app\api\service\province\BaseService;
use app\api\service\province\GD\ApiClient;
class BusinessLogic extends BaseService
{
protected $apiClient;
// 通过构造函数注入接口类
public function __construct(ApiClient $apiClient)
{
$this->apiClient = $apiClient;
}
public function getCode(array $requestData): array
{
$arr=$this->apiClient->getGuangdongData();
$arr['deal']="处理后";
return $arr;
}
}
接口调用类,通过依赖注入到业务逻辑类:
<?PHP
namespace app\api\service\province\GD;
class ApiClient
{
// 广东专属的接口调用逻辑
public function getGuangdongData(): array
{
// 实际调用接口...
return [
'code' => 200,
'data' => ['order_no' => '数据']
];
}
}