PHPackages                             aik27/drom-client - 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. aik27/drom-client

ActiveLibrary

aik27/drom-client
=================

Drom client is a PHP HTTP client library for exam

v1.0.6(4y ago)06MITPHPPHP &gt;=7.4.0

Since Nov 5Pushed 4y ago1 watchersCompare

[ Source](https://github.com/aik27/drom-client)[ Packagist](https://packagist.org/packages/aik27/drom-client)[ RSS](/packages/aik27-drom-client/feed)WikiDiscussions master Synced 5d ago

READMEChangelog (2)Dependencies (3)Versions (3)Used By (0)

Задание №2:
===========

[](#задание-2)

**Условие:**

Необходимо реализовать клиент для абстрактного (вымышленного) сервиса комментариев "example.com".

Проект должен представлять класс или набор классов, который будет делать http запросы к серверу. На выходе должна получиться библиотека, который можно будет подключить через composer к любому другому проекту.

У этого сервиса есть 3 метода:

- GET  - возвращает список комментариев
- POST  - добавить комментарий.
- PUT [http://example.com/comment/{id}](http://example.com/comment/%7Bid%7D) - по идентификатору комментария обновляет поля, которые были в в запросе

Объект comment содержит поля:

- id - тип int. Не нужно указывать при добавлении.
- name - тип string.
- text - тип string.

Написать phpunit тесты, на которых будет проверяться работоспособность клиента. Сервер example.com писать не надо! Только библиотеку для работы с ним.

Решение задания
---------------

[](#решение-задания)

Клиент написан с нуля, оформлен в библиотеку и опубликован на Packagist:

При анализе условий задания было решено немного его усложнить. В частности, сделать так, чтобы клиент был более гибким и универсальным, а не ограничивался работой только с комментариями и перечисленными адресами.

Для этого были реализованы следующие возможности:

- Создание разных конфигураций клиента через экземпляры класса `Config` с возможностью смены целевых адресов и контекста применения.
- Создание разных сценариев валидации данных перед отправкой на сервер через экземпляры класса `Scenario`
- Использование взаимозаменяемых адаптеров для работы с разными HTTP библиотеками (`GuzzleClient` и `SymfonyClient`) и возможность создать собственный на основе общего интерфейса.
- Использование взаимозаменяемых валидаторов ответа сервера (`JsonValidator`, `XmlValidator`) и возможность создать собственный на основе общего интерфейса.

**Установка**

```
composer require aik27/drom-client
```

**Применение**

```
use aik27\DromClient\Client;
use aik27\DromClient\Config;
use aik27\DromClient\Scenario;
use aik27\DromClient\Http\GuzzleClient;
use aik27\DromClient\Validators\JsonValidator;

try {

    /*
     * Конфигурирование клиента под условия тестового задания.
     */

    $config = new Config([

        /*
         * Список целевых адресов.
         * В данном случае, для сервиса комментариев.
         */

        'urlGetAll' => 'http://example.com/comments',
        'urlCreate' => 'http://example.com/comment',
        'urlUpdate' => 'http://example.com/comment/{id}',

        /*
         * Внедрение зависимостей.
         * Для HTTP клиента реализованы взаимозаменяемые адаптеры GuzzleClient() и SymfonyClient()
         * Для валидации ответа сервера JsonValidator() и XmlValidator()
         * Использование валидатора ответа не является обязательным.
         */

        'httpClient' => new GuzzleClient(),
        'validator' => new JsonValidator(),

        /*
         * Сценарии валидации данных на стороне клиента перед отправкой.
         * Реализуются через экземпляры класса Scenario.
         * Использование сценариев не является обязательным.
         *
         * Доступные типы параметров валидации:
         *
         *  type - int|string - проверка типа значения [обязательный]
         *  required - true|false - является ли поле обязательным
         */

        'scenarioCreate' => new Scenario([
            'name' => [
                'type' => 'string',
                'required' => true,
            ],
            'text' => [
                'type' => 'string',
                'required' => true,
            ],
        ]),
        'scenarioUpdate' => new Scenario([
            'id' => [
                'type' => 'int',
                'required' => true,
            ],
            'name' => [
                'type' => 'string',
                'required' => false,
            ],
            'text' => [
                'type' => 'string',
                'required' => false,
            ],
        ]),
    ]);

    $client = new Client($config);

    /*
     * Возвращает список записей путём отправки GET запроса на urlGetAll.
     *
     * Метод принимает необязательный аргумент (array) $param
     * в котором можно перечислить ключ/значения, которые будут переданы в запросе как GET переменные.
     * Например, параметр сортировки, номер страницы или условие фильтрации данных.
     */

    $client->getAll();

    /*
     * Добавляет запись путём отправки POST запроса на urlCreate.
     * Принимает обязательный аргумент (object) $data.
     * Конкретные поля должны быть свойствами объекта.
     */

    $client->create((object)[
        'name' => 'Alexandr',
        'text' => 'Hello world',
    ]);

    /*
     * Редактирует запись путём отправки PUT запроса на urlUpdate.
     * Принимает обязательный аргумент (object) $data.
     * Конкретные поля должны быть свойствами объекта.
     * Можно указать только нужные поля.
     */

    $client->update((object)[
        'id' => 42,
        'text' => 'New text',
    ]);
} catch (\Exception $e) {
    echo $e->getMessage();
}
```

**PHPUnit тесты**

Написано 26 тестов покрывающие различные варианты конфигурации, сценарии валидации и запросы.

###  Health Score

22

—

LowBetter than 22% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community4

Small or concentrated contributor base

Maturity51

Maturing project, gaining track record

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 ~0 days

Total

2

Last Release

1651d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/2b35bd841879b9c1d030bdf263e870b9c24a7d2b9bd4dff94dba930a804602ed?d=identicon)[aik27](/maintainers/aik27)

### Embed Badge

![Health badge](/badges/aik27-drom-client/health.svg)

```
[![Health](https://phpackages.com/badges/aik27-drom-client/health.svg)](https://phpackages.com/packages/aik27-drom-client)
```

###  Alternatives

[sylius/sylius

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

8.4k5.6M651](/packages/sylius-sylius)[craftcms/cms

Craft CMS

3.6k3.6M2.6k](/packages/craftcms-cms)[firefly-iii/data-importer

Firefly III Data Import Tool.

7545.8k](/packages/firefly-iii-data-importer)[blair2004/nexopos

The Free Modern Point Of Sale System build with Laravel, TailwindCSS and Vue.js.

1.2k2.3k](/packages/blair2004-nexopos)[sylius/core

Sylius e-commerce core. It integrates all components.

10143.1k31](/packages/sylius-core)[sproutcms/cms

Enterprise content management and framework

241.6k4](/packages/sproutcms-cms)

PHPackages © 2026

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