杉哥的个人博客

记录一下统一流量商城的架构设计

要求为:1、多个分省对外暴露统一接口。2、统一请求、响应参数。

订购部分代码架构设计为:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
app
├─service
│ └─province
│ ├─ GD # 广东代码
│ │ ├─ ApiClient.php # 广东专属接口调用类
│ │ └─ BusinessLogic.php # 广东业务逻辑类
│ ├─ HN # 其他省份代码
│ │ └─略
│ └─ HandlerFactory.php # 省份路由工厂
│ └─ BaseService.php # 抽象基类(约束)
└─ controller
└─ Gateway.php # 统一入口控制器
app ├─service │ └─province │ ├─ GD # 广东代码 │ │ ├─ ApiClient.php # 广东专属接口调用类 │ │ └─ BusinessLogic.php # 广东业务逻辑类 │ ├─ HN # 其他省份代码 │ │ └─略 │ └─ HandlerFactory.php # 省份路由工厂 │ └─ BaseService.php # 抽象基类(约束) │ └─ controller └─ Gateway.php # 统一入口控制器
app
├─service
│ └─province
│   ├─ GD                         # 广东代码
│   │  ├─ ApiClient.php           # 广东专属接口调用类
│   │  └─ BusinessLogic.php       # 广东业务逻辑类
│   ├─ HN                         # 其他省份代码
│   │  └─略
│   └─ HandlerFactory.php         # 省份路由工厂
│   └─ BaseService.php            # 抽象基类(约束)
│
└─ controller
   └─ Gateway.php                # 统一入口控制器

 

 

统一入口控制器:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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\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\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);
    }
}

工厂类,通过编码路由到分省控制器:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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; 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;
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);
    }
}

抽象类,用于约束子类:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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; 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;

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;

}

 

分省业务逻辑类,要继承抽象类:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?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; 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;

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;
    }
}

接口调用类,通过依赖注入到业务逻辑类:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?PHP
namespace app\api\service\province\GD;
class ApiClient
{
// 广东专属的接口调用逻辑
public function getGuangdongData(): array
{
// 实际调用接口...
return [
'code' => 200,
'data' => ['order_no' => '数据']
];
}
}
<?PHP namespace app\api\service\province\GD; class ApiClient { // 广东专属的接口调用逻辑 public function getGuangdongData(): array { // 实际调用接口... return [ 'code' => 200, 'data' => ['order_no' => '数据'] ]; } }
<?PHP
namespace app\api\service\province\GD;

class ApiClient
{
    // 广东专属的接口调用逻辑
    public function getGuangdongData(): array
    {
        // 实际调用接口...
        return [
            'code' => 200,
            'data' => ['order_no' => '数据']
        ];
    }
}