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