定制 aik27/drom-client 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

aik27/drom-client

Composer 安装命令:

composer require aik27/drom-client

包简介

Drom client is a PHP HTTP client library for exam

README 文档

README

Условие:

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

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

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

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

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

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

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

Клиент написан с нуля, оформлен в библиотеку и опубликован на Packagist: https://packagist.org/packages/aik27/drom-client

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

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

  • Создание разных конфигураций клиента через экземпляры класса 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 тестов покрывающие различные варианты конфигурации, сценарии валидации и запросы.

aik27/drom-client 适用场景与选型建议

aik27/drom-client 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 6 次下载、GitHub Stars 达 0, 最近一次更新时间为 2021 年 11 月 05 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 aik27/drom-client 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 aik27/drom-client 我们能提供哪些服务?
定制开发 / 二次开发

基于 aik27/drom-client 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 6
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 2
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2021-11-05