Erstellen einer benutzerdefinierten Wrapper-API-Architektur basierend auf GRASP-Mustern und SOLID-Prinzipien

EinfĂĽhrung


Weißt du was ich nicht mag? - Ich mag es nicht, wenn ich ab und zu aus meiner gemütlichen IDE aussteigen muss, um in der API-Dokumentation einiger Dienste nachzuschlagen, welche Parameter in der nächsten Entität vorhanden sind. Im Ernst, einige Dienste, wenn sie ihr eigenes SDK / Wrapper erstellen oder was auch immer sie dort haben, werden sich nur wenige Leute die Mühe machen, die Benutzerinteraktion mit dem Wrapper mithilfe eines Datenkonverters (Data Mapper) zu implementieren. Dies kann jedoch das Leben einfacher Entwickler, die die API verwenden, erheblich vereinfachen.


In dieser Hinsicht habe ich beschlossen, zu schreiben dein Fahrradeigener Wrapper für die Bitrix24 API in PHP, as offiziell - lässt im obigen Plan zu wünschen übrig.


In dem Artikel habe ich:


  • Ich werde meine Denkweise beschreiben, wenn ich ĂĽber Architektur nach den Prinzipien von GRASP und SOLID nachdenke
  • Ich werde mich ins Bein schieĂźen und dann die Situation korrigieren
  • Ich werde einen Prototyp mit den ersten Entitäten und Methoden entwickeln

Die richtige Architektur finden


Zunächst müssen Sie entscheiden, wie der Benutzer den Wrapper verwenden soll. Wenn Sie in der Anfangsphase nicht darüber nachdenken und sofort mit dem Skizzieren der Architektur beginnen, können Sie genau das bekommen, was Sie wollten. Sie müssen also entscheiden, welche Funktionalität wir als Ausgangspunkt haben, und die Implementierung schrittweise beginnen, indem Sie die Aufgabe vorab zerlegen. Wenn dieses Prinzip verletzt wird, kann es am Ende gelingen, die Schnittstellen in einem der Programmmodule oder sogar in mehreren zu desynchronisieren, selbst wenn das Projekt alleine durchgeführt wird.


Bild


, - - , . 24.


, API « », - , OAuth2.0.
« », , , .


, . , .


, . , , , , , :


$leads = BX24Wrapper\Engine\WebHook::instane('https://b24-xxxxxx.bitrix24.ru/rest/1/********/')
    ->resources()
    ->leads()
    ->list(['STATUS' => 'NEW']);

$applicationEngine = BX24Wrapper\Engine\Application::instane('client_id', 'client_secret', 'access_token',...);
$leads = $applicationEngine
    ->resources()
    ->leads()
    ->list(['STATUS' => 'NEW']);
//      -  ,   
$responseFromSomeCall = $applicationEngine->get('crm.some.list', ['SOME' => 'VALUE']); 

, 2 (WebHook Application), « », . resources() , , (leads, deals, tasks…), — (list, add, update…). , … ? , , … .


, , UML- :




Engine\AbstractBasic — API.
Resources – , .
Resource\AbstractBasic — , API-, API-, .
Entity\AbstractBasic — -, API-.


, , Engine\AbstractBasic Resources , , . , , GRASP- « », .
_engine Resources – Resource\AbstractBasic . , , « ».


, - orders(), contacts() .. , Resources , « » SOLID- «/». , , .


, , , . !


, Engine Resources? Resources, , , , .


, ? IDE , — . , .


, :


$leads = Resource\Lead::instane(new Engine\WebHook('https://b24-xxxxxx.bitrix24.ru/rest/1/********/'))
    ->list(['STATUS' => 'NEW']);

$applicationEngine = BX24Wrapper\Engine\Application::instane('client_id', 'client_secret', 'access_token',...);
$leads = Resource\Lead::instane($applicationEngine)
    ->list(['STATUS' => 'NEW']);

$responseFromSomeCall = $applicationEngine->get('crm.some.list', ['SOME' => 'VALUE']);

, , , . , :




, , , , . , : → . , , API- , , , . .


Bild


, . : « ?» – - , «», , , , , , .


, Resource\AbstractBasic, , . — API- , – API- .
– «», Resource\AbstractBasic …



Bild


, . API-, , . . , , , …


! ( , ), ? ? , ?! .


Resource, — , !


$resource = Resource\Batch::instane(new Engine\WebHook('https://wtfkjg.ru/fdsgfds'));
$resource->sendBatchCalls([
    'lead_ids' => Resource\FindByComm::find(['type' => 'EMAIL', 'values' => ['79780001122'], 'entity_type' => 'LEAD']),
    'contacts' => Resource\Contact::list(['ID' => "\$result['lead_ids'][LEAD]"]),
]);

, - API-, . , Request. , .


Bild


, , Request. , …


, , ? ? , Resources, ? «» «/» - list, get ..


, , , Request- , . :


$engine = new Engine\WebHook('https://b24-xxxxxx.bitrix24.ru/rest/1/********/');

$leads = $engine->execute(Request\Lead\Items::all(['STATUS' => 'NEW'], ['ID' => 'DESC']));

$responseFromSomeGetCall = $engine->execute(Request\Custom::get('some.api.method', ['SOME' => 'PARAMS']));
$responseFromSomePostCall = $engine->execute(Request\Custom::post('some.api.method', ['SOME' => 'PARAMS']));

$response = $engine->execute([
    'lead_ids' => Request\FindByComm\Find::byPhone('79780001122', 'LEAD'),
    'contacts' => Request\Contact\Items::firstPage(['ID' => "\$result['lead_ids'][LEAD]"], ['ID' => 'ASC']),    
]);  



, (), execute , , http- . , API- . , -, .


, , , , - .


, :
-, , execute, mixed. , IDE , . , .. , .


, ?


-, API- , 1 = 1 . - . , , , .



, API . , 24. !


GRASP SOLID, , .


GRASP:


  • : .
  • : Builder, .
  • : .
  • : .
  • : , , , .
  • : , . .
  • : Builder.
  • : Builder, .

SOLID:


  • : , .
  • /: API-, , , .
  • : , , , .
  • : , .
  • : , , , 0, .

, , . ? , , 100%, 90%, , . , , — . , …


-, GRASP SOLID - , . . - «», .


, .
: https://github.com/Dangetsu/bitrix24-api-wrapper
, , .


PHP 7.1, , .


:
slyshkin


:



All Articles