您好,登錄后才能下訂單哦!
這篇文章主要介紹PHP接口版本如何控制兼容多端接口,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
在對接第三方接口的時候,總是會看到接口后綴會帶著v1,v2這樣的標識,我們知道這些都是接口版本的概念,那么如果我方需要提供對外的接口,或者對接web端和APP端的時候,希望公用同一個接口,但是接口所渲染的數據表現形式不太一致,以及接口授權也不太一致的情況下,如何做到使用不同版本,且不同版本直接互不影響且同時共存呢?
首先筆者在考慮到接口設計時,有幾大模塊:
控制器層(controller):筆者將其定義為入口層(相當于java的dao層)
服務層(services):邏輯服務層,控制器入口層通過版本號標識轉接到不同的服務層,具體的代碼邏輯實現都在此處編寫
行為層(behavior):也可理解為事件層,服務中間件,行為鉤子都將在此處控制,入口權限過濾校驗,對接第三方服務擴展通過行為鉤子抽出,不讓其加大服務層的代碼臃腫
模型層(model):該層根據實際業務和開發習慣而定,可要可不要
校驗層(validate):筆者認為很有必要,所有獨立拉出一個目錄來做相關校驗,不管是獨立校驗,校驗引擎,還是框架自帶校驗都在該目錄定義,方便維護和擴展
公共層(common):系統公共代碼,比如附件上傳,下載等
配置層(config):內部配置,根據需求自定義是否需要
語言包(lang):根據需求而定
復用層(tarits):根據實際需求而定
任務層(job):根據實際需求而定
目錄層級如圖所示:
那么在入口層如何轉接到服務層呢?因為在這過程我們會將接口中的版本號轉接到不同的版本服務層。
首先在控制器入口層寫一個基類控制器,后續所有的控制器都將會繼承該類,在構造函數中調取行為類中的解析服務層代碼,將服務層類初始化給基類變量!
public $service = null; /** * 構造函數處理頭部請求 * * @return void */ public function __construct($type = 0, Request $request) { // 登錄跳過 if (!$type) { // 注冊行為監聽 Hook::add('app_init', [ // 校驗請求接口的身份(身份驗證) 'app\\saas\\behavior\\AuthToken' ]); Hook::listen('app_init', []); } // 立即執行初始化控制器服務應用 $this->service = Hook::exec('app\\saas\\behavior\\InitializtionService', ['tag' => $type, 'request' => $request]); }
服務InitializtionService解析路由,判斷,將服務層實例化
public function run($params) { // 兼容控制器分層,優化控制器目錄結構 $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]) ) { // 默認規則返回,在前在后不允許返回其他信息 $service = $reflection->getStaticProperties()['versions'][$verion]; // 判斷控制器服務文件是否存在 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(); }
這樣在控制器中文件定義如下調用服務層邏輯代碼,而不用關心是屬于哪個服務層類,服務層代碼只和版本有關
class Sysorder extends Saas { /** * 版本服務調度屬性--必須默認一個且是v1 * * @var array */ protected static $versions = [ 'v1' => \app\saas\services\syscenter\Sysorder::class, ]; /** * 獲取信息集權限目錄 * * @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()); }
以上是PHP接口版本如何控制兼容多端接口的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。