Задачей было разработать небольшой модуль, который бы работал с апи транспортных компаний, и по запросу выгружал стоимость доставки груза определенной массы.
Информацию необходимо было предоставить списоком транспортных компаний с соответствующей стоимостью.
Особенности: нужно было сделать "безболезненное" добавление последующих ТК в рабочий код.
В основном использовались такие паттерны как декоратор, фабрика/фабричный метод.
В решении проблемы я исходил из следующего соображения, мы должны быстро подстраиваться под бизнес, и часто меняющиеся бизнес требования следовательно наш код должен быть легко расширяем, заменяем, при этом без ущерба для архитектуры, и без изменения старой логики, без изменения старого кода. т.е. чтобы соблюдался принцип открытости/закрытости. Для меня это один из самых важных приниципов который позволяет писать устойчивое к ошибкам ПО. В целом код должен соответствовать принципам SOLID, GRASP. Приведу пример:
new WithError ( //Добавляем обработку ошибок
new WithPrintedSlowCost( //С распечатанной стоимостью
new SlowPackage( //сделанная как медленное отправление
$packageObj //дефолтная посылка
),
$factory
)
)
-
Если бизнесу необходимо будет ввести новый функционал, например, акции, то мы добавим новый декоратор акций, например
PromotionPackage (...)
и уже в этом декораторе будем определять какую либо акцию. -
Если нужно будет внести в систему новый тип посылок, то сделаем новый декоратор, например
NormalPackage
, и опишем его свойства. -
Если нам нужно убрать поле
error
из вывода, и вообще отключить вывод всех ошибок достаточно убрать декораторWithError
. -
Если наоборот необходимо добавить обработку специфических ошибок, например ошибки валидации данных то можем создать еще 1 декоратор, например
ValidatedPackage
. Но задачу валидации я решаю в своих проектах несколько иначе. Там у меня сама форма валидирует данные я только обращаюсь к ней, и говорю "дай мне провалидированные поля", если в валидации ошибка, кидается исключение и обрабатывается.
Как видим, на вызовы бизнеса мы можем реагировать достаточно быстро. при этом код соответствует (насколько я понимаю) принципам солид.
Чтобы запустить модуль в своей среде необходимо:
- Установить Docker-compose
- Перейти в дирректорию docker
- Создать файл .env (можно скопирвоать из образца)
- Добавить в hosts файл домен указанный в .env файле, связать его с ип
127.0.0.1
- Запустить
docker-compose up -d
- Для быстрого доступа к апи, используйте postman https://www.postman.com/solar-robot-131180/workspace/hr365/collection/2231425-4377a6dd-0932-4d68-b9ec-b13101c56e13?action=share&creator=2231425
После установки всех зависимостей модуль будет доступен по указанному вами домену,
у меня это hr365.my:83
миграции и пр. применятся автоматически.