首先在控制器入口層寫一個基類控制器,后續(xù)所有的控制器都將會繼承該類,在構(gòu)造函數(shù)中調(diào)取行為類中的解析服務(wù)層代碼,將服務(wù)層類初始化給基類變量!
public $service = null;
/**
* 構(gòu)造函數(shù)處理頭部請求
*
* @return void
*/
public function __construct($type = 0, Request $request)
{
// 登錄跳過
if (!$type) {
// 注冊行為監(jiān)聽
Hook::add('app_init', [
// 校驗請求接口的身份(身份驗證)
'app\\\\\\\\saas\\\\\\\\behavior\\\\\\\\AuthToken'
]);
Hook::listen('app_init', []);
}
// 立即執(zhí)行初始化控制器服務(wù)應(yīng)用
$this->service = Hook::exec('app\\\\\\\\saas\\\\\\\\behavior\\\\\\\\InitializtionService', ['tag' => $type, 'request' => $request]);
}
服務(wù)InitializtionService解析路由,判斷,將服務(wù)層實例化
public function run($params)
{
// 兼容控制器分層,優(yōu)化控制器目錄結(jié)構(gòu)
$controller = request()->controller();
$controllerArray = explode('.', $controller);
$controllerLength = count($controllerArray);
$appendControllerName = '';
if ($controllerLength == 1) {
$appendControllerName = $controllerArray[0];
} else {
for ($i = 0; $i < $controllerLength - 1; $i ) {
$appendControllerName .= strtolower($controllerArray[$i]) . '\\\\\\\\';
}
$appendControllerName .= ucfirst($controllerArray[($controllerLength - 1)]);
}
// $controller = '\\\\\\\\app\\\\\\\\saas\\\\\\\\controller\\\\\\\\' . request()->controller();
$controller = '\\\\\\\\app\\\\\\\\saas\\\\\\\\controller\\\\\\\\' . $appendControllerName;
$verion = request()->param('version');
$init_service = function () use ($controller, $verion, $params) {
// dump($controller);
// $controller = '\\\\app\\\\saas\\\\controller\\\\test\\\\Test';
$reflection = new \\\\ReflectionClass($controller);
if (property_exists($controller, 'versions')
&& isset($reflection->getStaticProperties()['versions'][$verion])
) {
// 默認(rèn)規(guī)則返回,在前在后不允許返回其他信息
$service = $reflection->getStaticProperties()['versions'][$verion];
// 判斷控制器服務(wù)文件是否存在
return class_exists($service) ? new $service($params['tag'], $params['request']) : Merror::getInstance()->jsonApi(40006);
} else {
Merror::getInstance()->jsonApi(40001);
}
};
return is_null($verion) ? Merror::getInstance()->jsonApi(40002) : $init_service();
}
這樣在控制器中文件定義如下調(diào)用服務(wù)層邏輯代碼,而不用關(guān)心是屬于哪個服務(wù)層類,服務(wù)層代碼只和版本有關(guān)
class Sysorder extends Saas
{
/**
* 版本服務(wù)調(diào)度屬性--必須默認(rèn)一個且是v1
*
* @var array
*/
protected static $versions = [
'v1' => \\\\app\\\\saas\\\\services\\\\syscenter\\\\Sysorder::class,
];
/**
* 獲取信息集權(quán)限目錄
*
* @method POST|GET
* @name getSubMenuListCate
*/
public function getSubMenuListCate()
{
return json($this->service->getSubMenuListCate());
}
/**
* 獲取列表
*
* @method POST|GET
* @name getSysOrderList
*/
public function getSysOrderList()
{
return json($this->service->getSysOrderList());
}
結(jié)語:此設(shè)計拋磚引玉,具體實現(xiàn)看各位phper大顯神通了!
api多版本接口設(shè)計模式,可以參考(基于ThinkPhp5.1實現(xiàn),框架不同,設(shè)計理念一致):www.kancloud.cn/lijianlin/ethantp5…
最后推廣一下筆者自研的一套基于laravel設(shè)計的工作流流程引擎(https://learnku.com/laravel/t/48967),歡迎研究自研!
注:我這個設(shè)計主要是為了多版本接口開發(fā)的一種設(shè)計而已,每個人都有自己的開發(fā)習(xí)慣,不予強(qiáng)制,只是以便代碼的維護(hù)和閱讀!僅此建議而已
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機(jī)的問題,請訪問西部數(shù)碼官網(wǎng):m.ps-sw.cn