根据GRASP模式和SOLID原理创建自定义包装API架构

介绍


你知道我不喜欢什么吗?-当我不得不偶尔离开舒适的IDE以查看某些服务的API文档时,我不喜欢它,下一个实体中存在哪些参数。认真地说,某些服务,如果他们创建自己的SDK /包装程序或其中的内容,很少有人会费心地使用数据转换器(Data Mapper)来实现与包装程序的用户交互。但这可以大大简化使用该API的简单凡人开发人员的生活。


对此,我决定写 你的自行车自己的PHP Bitrix24 API包装器,如下 官员-在上述计划中有很多不足之处。


在本文中,我:


  • 我将根据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