- Notifications
You must be signed in to change notification settings - Fork10
License
Digsolab/mytarget-php-ads-sdk
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
PHP клиент для работы с MyTarget API (v1/v2).
composer require dsl/my-target-sdk$clients =newClientOperator(...);$client =$clients->create(newAdditionalUserInfo("cl1"));$campaigns =newCampaignOperator(...);$targeting =newCampaignTargeting();$targeting->setAge(range(20,30));$targeting->setSex(Sex::female());$createCampaign =newCreateCampaign("awesome campaign",newPackageId(83),$targeting);$createCampaign->setStatus(Status::active());$createdCampaign =$campaigns->forClient($client->getUsername())->create($createCampaign);
Также можно не использовать*Operator классы, и вместо этого составлять запросы вручную. (об этомниже)
Для того чтобы пример выше заработал нужно создать граф зависимостей дляClientOperator иCampaignOperator.Зависят оба этих оператора от компонентовClient иMapper.Для песочницы, инстанциировать клиент вместе с его зависимостями можно так:
namespacesandbox;useMyTarget\Client;useGuzzleHttp\Psr7\Uri;useGuzzleHttp\ClientasGuzzleClient;useMyTarget\Transport\GuzzleHttpTransport;useMyTarget\Transport\Middleware\HttpMiddlewareStack;useMyTarget\Transport\Middleware\HttpMiddlewareStackPrototype;useMyTarget\Transport\Middleware\Impl\CallbackMiddleware;useMyTarget\Transport\Middleware\Impl\ResponseValidatingMiddleware;useMyTarget\Token\Token;usePsr\Http\Message\RequestInterface;$baseUri =newUri('https://target.my.com');$token =newToken("ACCESS_TOKEN","bearer",new \DateTime(),"");// библиотека также в состоянии управлять набором токенов в любом типе хранилища (а также получать новые и рефрешить)$http =newGuzzleHttpTransport(newGuzzleClient());$httpStack = HttpMiddlewareStackPrototype::newEmpty($http);$httpStack->push(newResponseValidatingMiddleware());// подпишем все запросы заранее полученным токеном (также можно использовать более сложный TokenGrantMiddleware, который способен хранить токен в любых хранилищах, обновлять и получать его)$accessToken ="foo bar";$httpStack->push(newCallbackMiddleware(function (RequestInterface$req,HttpMiddlewareStack$stack,$context =null)use ($accessToken) {$req =$req->withHeader('Authorization',sprintf('Bearer %s',$accessToken));return$stack->request($req,$context);}));$client =newClient(newRequestFactory($baseUri),$httpStack);
Это создаст простейший клиент который может самостоятельно подписывать все запросы переданным токеном и возвращать ответ в виде массива (либо выбрасывать исключение если что-то пошло не так).Помимо этого есть дополнительные возможности, такие как управление токенами и учёт лимитов API. (об этом вAdvanced features)Создать маппер для песочницы гораздо проще:
$autoloader =require_once__DIR__ .'/../vendor/autoload.php';// когда подключается автолоадер нужно присвоить его переменной (этот код будет в самом начале)AnnotationRegistry::registerLoader([$autoloader,'loadClass']);// нужно для правильной работы doctrine/annotations$mapper =\MyTarget\simpleMapper($debug =true);
Теперь можно создатьClientOperator и получить список клиентов:
$clients =newClientOperator($client,$mapper);var_dump($clients->all());
TODO
Весь проект разделен на несколько компонентов:
- Клиент (Transport) - всё что касается коммуникаций через сеть
- Маппер - нужен для того чтобы отображать ответы API на объекты
- Набор операторов - типизируют все возможные отправляемые и получаемые значения в виде объектов
Клиент использует наборmiddleware объектов которые имеют доступ к чтению/изменению запросов и ответов API.Это позволяет легко разбивать различную функциональность, которая как-то связана с обработкой запросов, в разные сущности.Например естьLimitingMiddleware,ClientGrantMiddleware иResponseValidatingMiddleware.Все они схожи в том, что все работают на уровне HTTP-сообщений, но при этом семантически не имеют ничего общего.
Маппер выполняет простую функцию отражения API-ответов на типизированные объекты:$mapper->hydrateNew('Foo', $jsonObject) вернёт экземплярFoo, где поля этого объекта будут заполнены в соответствии с аннотациями видаField(name="api_field_name", type="string") на них.
Операторы связывают два упомянутых выше компонента и позволяют работать с API на более высоком уровне. Но если вам не нравится работать с объектами и вас устраивают произвольные массивы данных, то есть возможность работать напрямую с клиентом. Таким образом вы все равно можете получить настроенную OAuth2 аутентификацию, конвертацию ошибочных ответов API в исключения и контроль ограничений на запросы.
Работа с сетью происходит с помощьюHttpMiddlewareStack. Этот стек содержит все обработчики HTTP ответов и запросов, которые "стекуются" друг на друга. Пример обработчика выглядит так:
class MyMiddlewareimplements HttpMiddleware{publicfunctionrequest(RequestInterface$request,HttpMiddlewareStack$stack,array$context =null) {return$stack->request($request,$context); }
Этот middleware просто вызывает следующий за ним middleware. Данный вызов всегда возвращает объект типаPsr7\ResponseInterface (либо выбрасывает исключение). Вот пример более полезного middleware, который может логировать весь HTTP-обмен:
class LoggingMiddlewareimplements HttpMiddleware{publicfunctionrequest(RequestInterface$request,HttpMiddlewareStack$stack,array$context =null) {try {$response =$stack->request($request,$context);log($request,$response);return$response; }catch (RequestException$e) {logError($request,$e);throw$e; } }}
Все исключения этой библиотеки подчиняются такой иерархии:
- MyTarget\Exception\MyTargetException - Интерфейс (маркер) всех исключений этой библиотеки (если есть необходимость "не выпускать" никаких исключений от СДК, то нужно ловить этот тип исключения) - MyTarget\Transport\Exception\TransportException - thrown during request transferring phase - MyTarget\Transport\Exception\RequestException - MyTarget\Transport\Exception\ClientErrorException - MyTarget\Transport\Exception\ConnectException - MyTarget\Transport\Exception\ServerErrorException - MyTarget\Transport\Exception\TooManyRedirectsException - MyTarget\Token\Exception\TokenRequestException - MyTarget\Token\Exception\TokenLimitReachedException - MyTarget\Token\Exception\TokenDeletedException - MyTarget\Limiting\Exception\ThrottleException - thrown before the request if you've reached the rate limit, or after the response is parsed and it contains a 429 code - MyTarget\Exception\DecodingException - thrown during response decoding phaseПомимо этого они все разделены на два вида:Dsl\MyTarget\Exception\ApiException иDsl\MyTarget\Transport\Exception\NetworkException.
Для того чтобы предложить свои изменения, вы можете сделать форк этого репозитория и создать PR с произвольным сообщением описывающим изменения.
About
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors7
Uh oh!
There was an error while loading.Please reload this page.