Membuat arsitektur API pembungkus khusus berdasarkan pola GRASP dan prinsip SOLID

pengantar


Apakah Anda tahu apa yang tidak saya sukai? - Saya tidak suka ketika saya harus keluar dari IDE saya yang nyaman sesekali untuk melihat dokumentasi API dari beberapa layanan parameter apa yang ada di entitas berikutnya. Ya ampun, beberapa layanan, jika mereka membuat SDK / pembungkus mereka sendiri atau apa pun yang mereka miliki di sana, beberapa orang akan repot untuk menerapkan interaksi pengguna dengan pembungkus menggunakan konverter data (Data Mapper). Tetapi ini dapat sangat menyederhanakan kehidupan pengembang fana sederhana menggunakan API.


Dalam hal ini, saya memutuskan untuk menulis sepedamubungkus sendiri untuk API Bitrix24 dalam PHP, sebagai resmi - meninggalkan banyak yang harus diinginkan dalam rencana di atas.


Dalam artikel itu, saya:


  • Saya akan menjelaskan cara berpikir saya ketika berpikir tentang arsitektur sesuai dengan prinsip-prinsip GRASP dan SOLID
  • Saya akan menembak diri sendiri di kaki, dan kemudian saya akan memperbaiki situasi
  • Saya akan mengembangkan prototipe dengan entitas dan metode pertama

Menemukan Arsitektur yang Tepat


Pertama-tama, Anda perlu memutuskan bagaimana pengguna akan menggunakan pembungkus. Jika Anda tidak memikirkannya pada tahap awal, dan segera mulai membuat sketsa arsitektur, maka Anda bisa mendapatkan yang Anda inginkan. Jadi, Anda perlu memutuskan fungsionalitas apa yang akan kami miliki sebagai titik awal, dan memulai implementasinya secara bertahap, melakukan pra-penguraian tugas. Jika prinsip ini dilanggar, maka pada akhirnya Anda mungkin berakhir dengan antarmuka sinkronisasi di salah satu modul program, atau mungkin bahkan dalam beberapa, bahkan jika proyek dilakukan sendiri.


gambar


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


gambar


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


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



gambar


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


gambar


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