Création d'une architecture d'API wrapper personnalisée basée sur des modèles GRASP et des principes SOLID

introduction


Savez-vous ce que je n'aime pas? - Je n'aime pas quand je dois sortir de mon IDE confortable de temps en temps pour regarder dans la documentation de l'API d'un service quels sont les paramètres dans l'entité suivante. Eh bien sérieusement, certains services, s'ils créent leur propre SDK / wrapper ou tout ce qu'ils ont, peu de gens prendront la peine de mettre en œuvre une interaction utilisateur avec le wrapper à l'aide d'un convertisseur de données (Data Mapper). Mais cela peut grandement simplifier la vie des simples développeurs mortels utilisant l'API.


À cet égard, j'ai décidé d'écrire ton vélopropre wrapper pour l'API Bitrix24 en PHP, comme officiel - laisse beaucoup à désirer dans le plan ci-dessus.


Dans l'article, je:


  • Je décrirai ma façon de penser en pensant à l'architecture selon les principes de GRASP et SOLID
  • Je vais me tirer une balle dans la jambe, puis je vais corriger la situation
  • Je développerai un prototype avec les premières entités et méthodes

Trouver la bonne architecture


Tout d'abord, vous devez décider comment l'utilisateur utilisera le wrapper. Si vous n'y réfléchissez pas au stade initial et que vous commencez immédiatement à esquisser l'architecture, vous pouvez obtenir ce que vous vouliez. Donc, vous devez décider quelles fonctionnalités nous aurons comme point de départ et commencer la mise en œuvre par étapes, en décomposant la tâche. Si ce principe est violé, vous pouvez finalement réussir à désynchroniser les interfaces dans l'un des modules du programme, voire dans plusieurs, même si le projet se fait seul.


image


, - - , . 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- , , , . .


image


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


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



image


, . 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. , .


image


, , 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