إنشاء بنية واجهة برمجة تطبيقات مجمّعة مخصصة بناءً على أنماط GRASP ومبادئ SOLID

المقدمة


هل تعرف ما لا يعجبني؟ - لا يعجبني ذلك عندما يتعين علي الخروج من IDE المريح من حين لآخر للبحث في وثائق API عن بعض الخدمات عن المعلمات الموجودة في الكيان التالي. حسنًا ، بعض الخدمات ، إذا قاموا بإنشاء SDK / المجمع الخاص بهم أو أيًا كان لديهم ، فإن القليل من الناس سيهتمون بتنفيذ تفاعل المستخدم مع المجمع باستخدام محول البيانات (Data Mapper). ولكن هذا يمكن أن يبسط إلى حد كبير حياة مطوري البشر البسطاء باستخدام API.


في هذا الصدد ، قررت أن أكتب دراجتكالمجمع الخاص لواجهة برمجة التطبيقات Bitrix24 في PHP ، مثل رسمي - يترك الكثير مما هو مرغوب فيه في الخطة المذكورة أعلاه.


في المقالة ، أنا:


  • سوف أصف طريقة تفكيري عند التفكير في الهندسة المعمارية وفقًا لمبادئ GRASP و SOLID
  • سأطلق النار على نفسي في ساقي ، ثم سأصحح الموقف
  • سوف أقوم بتطوير نموذج أولي مع الكيانات والأساليب الأولى

إيجاد العمارة الصحيحة


بادئ ذي بدء ، عليك أن تقرر كيف سيستخدم المستخدم الغلاف. إذا كنت لا تفكر في الأمر في المرحلة الأولية ، وتبدأ على الفور في رسم الهندسة المعمارية ، فيمكنك الحصول على ما تريده تمامًا. لذلك ، تحتاج إلى تحديد الوظيفة التي سنحصل عليها كنقطة انطلاق ، وبدء التنفيذ على مراحل ، وتحليل المهمة مسبقًا. إذا تم انتهاك هذا المبدأ ، فقد تنجح في النهاية في إلغاء مزامنة الواجهات في إحدى وحدات البرنامج ، أو حتى في عدة وحدات ، حتى إذا تم تنفيذ المشروع بمفرده.


صورة


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


صورة


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


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



صورة


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


صورة


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