


Zur Versionskontrolle der PHP-Schnittstelle [kompatibel mit Multi-Terminal-Schnittstellen]
推荐:《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()); }
结语:此设计抛砖引玉,具体实现看各位phper大显神通了!
api多版本接口设计模式,可以参考(基于ThinkPhp5.1实现,框架不同,设计理念一致):www.kancloud.cn/lijianlin/ethantp5...
最后推广一下笔者自研的一套基于laravel设计的工作流流程引擎(https://learnku.com/laravel/t/48967),欢迎研究自研!
注:我这个设计主要是为了多版本接口开发的一种设计而已,每个人都有自己的开发习惯,不予强制,只是以便代码的维护和阅读!仅此建议而已
Das obige ist der detaillierte Inhalt vonZur Versionskontrolle der PHP-Schnittstelle [kompatibel mit Multi-Terminal-Schnittstellen]. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Erstellen Sie Referenzen Tabelle, um Empfehlungsbeziehungen zu erfassen, einschließlich Empfehlungen, Empfehlungen, Empfehlungscodes und Nutzungszeit; 2. Definieren Sie die Beziehungen zwischen Hörern und Hasmany im Benutzermodell, um Empfehlungsdaten zu verwalten. 3. Erstellen Sie bei der Registrierung einen eindeutigen Empfehlungscode (kann durch Modellereignisse implementiert werden). 4. Erfassen Sie den Empfehlungscode, indem Sie die Parameter während der Registrierung abfragen, nach Überprüfung eine Empfehlungsbeziehung aufstellen und die Selbstverantwortung verhindern. 5. den Belohnungsmechanismus auslösen, wenn empfohlene Benutzer das angegebene Verhalten (Abonnementauftrag) abschließen; 6. Generieren Sie gemeinsame Empfehlungsverbindungen und verwenden Sie URLs mit Laravel Signature, um die Sicherheit zu verbessern. 7. Empfehlungsstatistiken auf dem Dashboard anzeigen, z. B. die Gesamtzahl der Empfehlungen und konvertierten Zahlen; Es ist notwendig, sicherzustellen, dass Datenbankbeschränkungen, Sitzungen oder Cookies bestehen bleiben.

CheckPhp> = 8.1, Komponist und Webserver; 2.CloneOrCreateProjectandruncompoSerinstall; 3.Copy.Env.Exampleto.EnvandrunphPartisanny : generieren; 4.setDatabasecredentialsin.envandrunphPartisanmigrate-seed; 5.StartServerWithPartisanServe; 6.OptionallyRunnpminpmin

Erstellen einer Seaskerdatei: Verwenden Sie PhPartisanMake: SeaseruSereDer, um die Säatorklasse zu generieren, und fügen Sie Daten über die Modellfabrik- oder Datenbankabfrage in der Run -Methode ein. 2. Rufen Sie einen anderen Säator in Databaseseeder an: Registrieren Sie den Benutzerseeder, Postseeder usw. Um sicherzustellen, dass die Abhängigkeit korrekt ist. 3. Ausführen von Sämaschinen: Führen Sie PhPartisandB aus: Saatgut, um alle registrierten Säter auszuführen, oder verwenden Sie Phpartisanmigrate: frisch-SEED, um die Daten zurückzusetzen und nachzufüllen; 4

ChooseseafatureFlagstrategyuchasconfig-basierte, datenbankgetriebene, orthird-partytools-ähnliche Flagsmith

Erstellen Sie ein neues Laravel -Projekt und starten Sie den Service. 2. Generieren Sie das Modell, die Migration und den Controller und führen Sie die Migration aus; 3. Definieren Sie die erholsame Route in Routen/api.php; V. 5. Verwenden Sie Postbote oder Curl, um die API -Funktion zu testen. 6. Fügen Sie optional die API -Authentifizierung durch Heiligtum hinzu; Erhalten Sie schließlich eine klare Struktur, vollständig und erweiterbar Laravelrestapi, geeignet für praktische Anwendungen.

Das Repository -Muster ist ein Entwurfsmuster, mit dem die Geschäftslogik aus der Datenzugriffslogik entkoppelt wird. 1. Es definiert Datenzugriffsmethoden über Schnittstellen (Vertrag); 2. Die spezifischen Vorgänge werden von der Repository -Klasse implementiert. 3. Die Controller verwendet die Schnittstelle durch Abhängigkeitsinjektion und kontaktiert nicht direkt die Datenquelle. 4. Vorteile sind ordentlicher Code, starke Testbarkeit, einfache Wartung und Teamzusammenarbeit; 5. Für mittlere und große Projekte können kleine Projekte das Modell direkt verwenden.

Eloquentorm ist das integrierte Relational Mapping-System von Laravel. Sie betreibt die Datenbank über PHP -Syntax anstelle von nativem SQL, wodurch der Code prägnanter und leicht zu warten ist. 1. Jede Datentabelle entspricht einer Modellklasse, und jeder Datensatz existiert als Modellinstanz. 2. Übernehmen Sie den aktiven Datensatzmodus, und die Modellinstanz kann selbst gespeichert oder aktualisiert werden. 3.. Support -Stapelzuweisung und das $ fillbare Attribut müssen im Modell definiert werden, um die Sicherheit zu gewährleisten. 4. Bieten Sie eine starke Beziehungsunterstützung wie eins zu eins, eins zu viele, viele zu viele usw., und Sie können über Methodenaufrufe auf die zugehörigen Daten zugreifen. 5. Integrierter Abfragekonstruktor, wo OrderBy und andere Methoden als Ketten bezeichnet werden können, um Abfragen zu erstellen; 6. Unterstützen Sie Zubehör und Modifikatoren, die die Nummer beim Erhalten oder Einlegen von Attributen formatieren können.

EgerloadingPreventsThen 1QueryProblembyloadingRelationshipSupfront.Then 1Problemoccurswhen1QueryFetchesRecords (z
