Сервисы

Сервисы представляют из себя набор модулей, написанных по стандарту zf2. Как правило, сервис сосредотачивает в себе набор бизнес-логики по определенному функционалу (контракты, процедуры, оос и т.д.).

Архитектура

Модули, образующие сервис, условно можно разделить на две части:

  • Абстрактная часть сервиса;
  • Конфигурация сервиса под конкретную информационную систему

Каждая из этих групп модулей, должна иметь по одному интеграционному модулю, который определяет версию сервиса, а также его базовые настройки.

Модули, образующие абстрактную часть сервиса, группируются в отдельный вендор. В случае если для адаптации сервиса под требования конкретного заказчика требуется несколько модулей, то допускается их группировка в отдельный вендор. Т.е. может быть применена следуящая схема:


project
  vendor
    nnx-contract
      contract
      contract-core
      contract-execution-223
      contract-api
    customer-vendor-contract
      contract
      contract-feature

В приведенном выше примере представлена структура сервиса контрактов. Абстрактная часть сервиса располагается в вендоре nnx-contract. Модуль nnx-contract/contract является интеграционным модулем для абстрактной части сервиса контрактов. Версия модуля nnx-contract/contract будет определять версию абстрактной части сервиса контрактов.

Адаптация сервиса контрактов для заказчика customer-vendor реализуется с помощью модуля customer-vendor-contract/contract. Этот модуль является интеграционным, версия данного модуля определяет версию контрактов. Также именно в этом модуле должен подключаться модуль customer-vendor-contract/contract-feature с функционалом, специфичным для конкретной информационной системы. Именно customer-vendor-contract/contract подключится на уровне приложения, и версия этого модуля определяет версию сервиса контрактов.

Рассмотрим случай, когда адаптация абстрактной части сервиса под конкретную информационную систему не требует множества модулей. Тогда можно не создавать отдельный вендор, а расположить интеграционный модуль в вендоре, содержащем функционал, адаптирующий абстрактные сервисы под конкретного заказчика. В таком случае структура директорий будет следующий:


project
  vendor
    nnx-contract
      contract
      contract-core
      contract-execution-223
      contract-api
    customer-vendor
      contract

Важно: конфигурация сервиса выносится в отдельный модуль, расположенный на уровне вендоров. Распологать конфигурационный модуль на уровне приложений не рекомендуется.

Сервисы, уровень вендора, уровень приложения

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

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

Версионность

Версией сервиса является версия интеграционного модуля, адаптирующего функционал абстрактного сервиса под конкретного заказчика.


project
  vendor
    nnx-contract
      contract(v1.0)
      contract-core(v0.4)
      contract-execution-223(v0.4)
      contract-api(v0.4)
    customer-vendor-contract
      contract(v1.1)
      contract-custom-feature(v1.0)

В примере выше версией сервиса контрактов будет версия 1.1, т.е. берется версия модуля customer-vendor\contract.

Подключение сервиса контрактов на уровне приложения через composer.json осуществляется следующим образом:

{
    "name": "app-service",
    "require": {
        "customer-vendor-contract/contract": "1.1"
    }
}

Зависимости модуля customer-vendor-contract/contract могут быть описаны следующим образом:

{
    "name": "customer-vendor-contract/contract",
    "require": {
        "nnx-contract/contract": "1.0",
        "customer-vendor-contract/contract-custom-feature": "1.0"
    }
}

Интеграционный модуль абстрактной части сервиса контрактов может быть описан следующим образом:

{
    "name": "nnx-contract/contract",
    "require": {
        "nnx-contract/contract-core": "0.4",
        "nnx-contract/contract-execution-223": "0.4",
        "nnx-contract/contract-api": "0.4"
    }
}