PHPackages                             dsl/my-target-sdk - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. dsl/my-target-sdk

AbandonedLibrary[API Development](/categories/api)

dsl/my-target-sdk
=================

API bindings for MyTarget

1.0.1(9y ago)87.6k9[5 issues](https://github.com/Digsolab/mytarget-php-ads-sdk/issues)1Apache License 2.0PHP

Since Aug 10Pushed 9y ago12 watchersCompare

[ Source](https://github.com/Digsolab/mytarget-php-ads-sdk)[ Packagist](https://packagist.org/packages/dsl/my-target-sdk)[ RSS](/packages/dsl-my-target-sdk/feed)WikiDiscussions master Synced 3w ago

READMEChangelog (10)Dependencies (9)Versions (21)Used By (1)

Unofficial MyTarget API Client
==============================

[](#unofficial-mytarget-api-client)

PHP клиент для работы с MyTarget API (v1/v2).

### Install it via composer

[](#install-it-via-composer)

```
composer require dsl/my-target-sdk

```

### How to work with it?

[](#how-to-work-with-it)

```
$clients = new ClientOperator(...);
$client = $clients->create(new AdditionalUserInfo("cl1"));

$campaigns = new CampaignOperator(...);

$targeting = new CampaignTargeting();
$targeting->setAge(range(20, 30));
$targeting->setSex(Sex::female());

$createCampaign = new CreateCampaign("awesome campaign", new PackageId(83), $targeting);
$createCampaign->setStatus(Status::active());

$createdCampaign = $campaigns->forClient($client->getUsername())->create($createCampaign);
```

Также можно не использовать `*Operator` классы, и вместо этого составлять запросы вручную. (об этом [ниже](#advanced-features-and-usage))

### Bootstrap it in 5 minutes

[](#bootstrap-it-in-5-minutes)

Для того чтобы пример выше заработал нужно создать граф зависимостей для `ClientOperator` и `CampaignOperator`. Зависят оба этих оператора от компонентов `Client` и `Mapper`. Для песочницы, инстанциировать клиент вместе с его зависимостями можно так:

```
namespace sandbox;

use MyTarget\Client;
use GuzzleHttp\Psr7\Uri;
use GuzzleHttp\Client as GuzzleClient;
use MyTarget\Transport\GuzzleHttpTransport;
use MyTarget\Transport\Middleware\HttpMiddlewareStack;
use MyTarget\Transport\Middleware\HttpMiddlewareStackPrototype;
use MyTarget\Transport\Middleware\Impl\CallbackMiddleware;
use MyTarget\Transport\Middleware\Impl\ResponseValidatingMiddleware;
use MyTarget\Token\Token;
use Psr\Http\Message\RequestInterface;

$baseUri = new Uri('https://target.my.com');
$token = new Token("ACCESS_TOKEN", "bearer", new \DateTime(), ""); // библиотека также в состоянии управлять набором токенов в любом типе хранилища (а также получать новые и рефрешить)

$http = new GuzzleHttpTransport(new GuzzleClient());
$httpStack = HttpMiddlewareStackPrototype::newEmpty($http);
$httpStack->push(new ResponseValidatingMiddleware());

// подпишем все запросы заранее полученным токеном (также можно использовать более сложный TokenGrantMiddleware, который способен хранить токен в любых хранилищах, обновлять и получать его)
$accessToken = "foo bar";
$httpStack->push(new CallbackMiddleware(function (RequestInterface $req, HttpMiddlewareStack $stack, $context = null) use ($accessToken) {
    $req = $req->withHeader('Authorization', sprintf('Bearer %s', $accessToken));
    return $stack->request($req, $context);
}));

$client = new Client(new RequestFactory($baseUri), $httpStack);
```

Это создаст простейший клиент который может самостоятельно подписывать все запросы переданным токеном и возвращать ответ в виде массива (либо выбрасывать исключение если что-то пошло не так). Помимо этого есть дополнительные возможности, такие как управление токенами и учёт лимитов API. (об этом в [Advanced features](#advanced-features-and-usage)) Создать маппер для песочницы гораздо проще:

```
$autoloader = require_once __DIR__ . '/../vendor/autoload.php'; // когда подключается автолоадер нужно присвоить его переменной (этот код будет в самом начале)
AnnotationRegistry::registerLoader([$autoloader, 'loadClass']); // нужно для правильной работы doctrine/annotations

$mapper = \MyTarget\simpleMapper($debug = true);
```

Теперь можно создать `ClientOperator` и получить список клиентов:

```
$clients = new ClientOperator($client, $mapper);

var_dump($clients->all());
```

### Advanced features and usage

[](#advanced-features-and-usage)

> TODO

### How does it work?

[](#how-does-it-work)

Весь проект разделен на несколько компонентов:

- Клиент (Transport) - всё что касается коммуникаций через сеть
- Маппер - нужен для того чтобы отображать ответы API на объекты
- Набор операторов - типизируют все возможные отправляемые и получаемые значения в виде объектов

Клиент использует набор [middleware](#httpmiddleware) объектов которые имеют доступ к чтению/изменению запросов и ответов API. Это позволяет легко разбивать различную функциональность, которая как-то связана с обработкой запросов, в разные сущности. Например есть `LimitingMiddleware`, `ClientGrantMiddleware` и `ResponseValidatingMiddleware`. Все они схожи в том, что все работают на уровне HTTP-сообщений, но при этом семантически не имеют ничего общего.

Маппер выполняет простую функцию отражения API-ответов на типизированные объекты: `$mapper->hydrateNew('Foo', $jsonObject)` вернёт экземпляр `Foo`, где поля этого объекта будут заполнены в соответствии с аннотациями вида `Field(name="api_field_name", type="string")` на них.

Операторы связывают два упомянутых выше компонента и позволяют работать с API на более высоком уровне. Но если вам не нравится работать с объектами и вас устраивают произвольные массивы данных, то есть возможность работать напрямую с клиентом. Таким образом вы все равно можете получить настроенную OAuth2 аутентификацию, конвертацию ошибочных ответов API в исключения и контроль ограничений на запросы.

### HttpMiddleware

[](#httpmiddleware)

Работа с сетью происходит с помощью `HttpMiddlewareStack`. Этот стек содержит все обработчики HTTP ответов и запросов, которые "стекуются" друг на друга. Пример обработчика выглядит так:

```
class MyMiddleware implements HttpMiddleware
{
    public function request(RequestInterface $request, HttpMiddlewareStack $stack, array $context = null)
    {
        return $stack->request($request, $context);
    }
```

Этот middleware просто вызывает следующий за ним middleware. Данный вызов всегда возвращает объект типа `Psr7\ResponseInterface` (либо выбрасывает исключение). Вот пример более полезного middleware, который может логировать весь HTTP-обмен:

```
class LoggingMiddleware implements HttpMiddleware
{
    public function request(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;
        }
    }
}
```

### Exceptions hierarchy

[](#exceptions-hierarchy)

Все исключения этой библиотеки подчиняются такой иерархии:

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

### How to contribute

[](#how-to-contribute)

Для того чтобы предложить свои изменения, вы можете сделать форк этого репозитория и создать PR с произвольным сообщением описывающим изменения.

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance8

Infrequent updates — may be unmaintained

Popularity27

Limited adoption so far

Community24

Small or concentrated contributor base

Maturity72

Established project with proven stability

 Bus Factor1

Top contributor holds 64.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~9 days

Total

20

Last Release

3424d ago

Major Versions

0.5.4 → 1.0.02017-02-03

### Community

Maintainers

![](https://www.gravatar.com/avatar/d1511421a22df3e21b0bbec3acf773908a003362a0bef6e796262b7336c9ef17?d=identicon)[coyl](/maintainers/coyl)

![](https://www.gravatar.com/avatar/ecfc045b76a34a2f33ca944aa33a92f78f0a83eef1a13782654a6844fc489e85?d=identicon)[oleko-dundich](/maintainers/oleko-dundich)

---

Top Contributors

[![nikita2206](https://avatars.githubusercontent.com/u/1030688?v=4)](https://github.com/nikita2206 "nikita2206 (75 commits)")[![coyl](https://avatars.githubusercontent.com/u/274452?v=4)](https://github.com/coyl "coyl (17 commits)")[![mem-memov](https://avatars.githubusercontent.com/u/1523512?v=4)](https://github.com/mem-memov "mem-memov (8 commits)")[![vmaslennikov-dsl](https://avatars.githubusercontent.com/u/18594158?v=4)](https://github.com/vmaslennikov-dsl "vmaslennikov-dsl (8 commits)")[![scarbo87](https://avatars.githubusercontent.com/u/2161963?v=4)](https://github.com/scarbo87 "scarbo87 (4 commits)")[![Tekill](https://avatars.githubusercontent.com/u/965890?v=4)](https://github.com/Tekill "Tekill (3 commits)")[![avolosyuk](https://avatars.githubusercontent.com/u/8543294?v=4)](https://github.com/avolosyuk "avolosyuk (2 commits)")

---

Tags

middleware

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/dsl-my-target-sdk/health.svg)

```
[![Health](https://phpackages.com/badges/dsl-my-target-sdk/health.svg)](https://phpackages.com/packages/dsl-my-target-sdk)
```

###  Alternatives

[aws/aws-sdk-php

AWS SDK for PHP - Use Amazon Web Services in your PHP project

6.2k532.1M2.5k](/packages/aws-aws-sdk-php)[algolia/algoliasearch-client-php

API powering the features of Algolia.

69634.4M144](/packages/algolia-algoliasearch-client-php)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.5k5.8M712](/packages/sylius-sylius)[typo3/cms

TYPO3 CMS is a free open source Content Management Framework initially created by Kasper Skaarhoj and licensed under GNU/GPL.

1.2k1.9M122](/packages/typo3-cms)[theodo-group/llphant

LLPhant is a library to help you build Generative AI applications.

1.7k371.6k6](/packages/theodo-group-llphant)[gotenberg/gotenberg-php

A PHP client for interacting with Gotenberg, a developer-friendly API for converting numerous document formats into PDF files, and more!

3845.9M26](/packages/gotenberg-gotenberg-php)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
