Обновление связанных данных в сервисах
Есть две сущности order
и item
.
У order есть items
, у обоих есть поля status
, debt_percentage
(процент долга от сотрудничества), amount
.
Для обоих сущностей есть сервисы.
У обоих сервисов есть методы updateDebtPercentage
, updateAmount
, syncStatus
- бизнес логика в них разная.
В чем ,собственно говоря, вопрос - обновление в одной сущности влияет на другую. Типа при обновление статуса в items
должно повлечь обновление статуса в order
(syncStatus()
) и наоборот.
При изменении компании, от которой пришел заказ, нужно пересчитать debtPercentage
в items
. То бишь мне нужно обеспечить синхронизацию между orders
и items
.
Вот как это сделать максимально просто - я не знаю.
Самая первая мысль была заинжектить сервисы, и при сохранении записи вызывать методы обновления нужных полей из внедренного сервиса. У классов получается слишком сильная связанность. Этот вариант порождает циклическую зависимость - поэтому был исключен.
Создание общего класса
ItemOrderService
(или фасада) в которые были вынесены все "общие" методы (updateItemAmount
,syncOrderStatus
etc.). Или наоборот создание подклассов типаSyncOrderStatus
. Варианты в принципе рабочие, но почему то мне кажется это излишним и неправильным в моей ситуации.Синхронизировать с помощью событий и слушателей. Вызывать в слушателях методы из сервисов. Тоже рабочий вариант, однако выйдет довольно много слушателей, либо запихнуть несколько действий в один слушатель, что мне не очень нравится.
Инжектить сервисы в методы. Понятие не имею, чем аукнется такой подход
public function changeStatus(Item $item, string $status): void { $item->update(['status' => $status]); (app(OrderServiceInterface::class))->syncStatus($item->order); }
По большей части перечисленные варианты - это попытка избежать сильной связанности этих двух классов. Я уже почти в полной уверенности, что причина этого в неправильном изначальном дизайне классов, однако я совсем не имею понятия каким образом это может быть реорганизованно. Буду очень рад если кто подтолкнёт в нужном направлении
Еще вопрос, нормально ли обновлять например какие то поля item
в orderService
?