symfony-bundles/service-layer

Service Layer Infrastructure

0.1.0 2020-01-14 20:58 UTC

This package is auto-updated.

Last update: 2020-01-14 21:00:52 UTC


README

SensioLabsInsight

Build Status Scrutinizer Code Quality Code Coverage Total Downloads Latest Stable Version License

How to use

  • Install package
composer req symfony-bundles/service-layer

Основные положения

Сервисный слой

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

Иначе - возвращается объект с определенным форматом ошибок.

Входящие и исходящие данные

Disclaimer: Классы входящих (DTO) и результирующих (*Result) данных в тестах сделаны иммутабельны для примера консистентности состояния.

В любом случае DTO-классы будут валидироваться перед тем как вызвать бизнес-логику сервиса. А данные результирующих классов не нуждаются в валидации и их целостность зависит от разработчика.

На тестовом примере CreateUserDto показаны кастомные и вложенные валидаторы.

Пользовательские валидаторы

Также пример написания кастомных валидаторов приведен здесь.

Как можно увидеть - все довольно тривиально. Валидаторы можно применять к свойствам DTO или же к целому объекту DTO (для валидации сувокупности свойств).

При необходимости внедрения зависимостей в пользовательский валидатор можно использовать метод __construct.

Внедрение зависимостей

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

Рекомендация: Если используется в качестве основного приложения Symfony - лучше всего сделать типажи с @required аннотацией и их повсеместно использовать в сервисах. Для этого создается директория DependencyInjection в которой будут находится трейты (пример: DocumentManagerTrait, EntityManagerTrait, LoggerTrait, Kafka\ProducerTrait, Repository\UserRepositoryTrait ...) и в конкретных сервисах используются неоходимые типажи с помощью use.

Особенности

При реализации сервиса, метод execute может иметь ковариантный результирующий класс (PHP 7.4). Но в аргументах данного метода не может быть контравариантного DTO-класса из-за особенностей языка. Этот случай можно решить с помощью абстрактного метода с ковариантным возвращаемым типом (нужно согласовать).