Обновление связанных данных в сервисах

Есть две сущности order и item.

У order есть items, у обоих есть поля status, debt_percentage (процент долга от сотрудничества), amount.

Для обоих сущностей есть сервисы.

У обоих сервисов есть методы updateDebtPercentage, updateAmount, syncStatus - бизнес логика в них разная.

В чем ,собственно говоря, вопрос - обновление в одной сущности влияет на другую. Типа при обновление статуса в items должно повлечь обновление статуса в order (syncStatus()) и наоборот.

При изменении компании, от которой пришел заказ, нужно пересчитать debtPercentage в items. То бишь мне нужно обеспечить синхронизацию между orders и items.

Вот как это сделать максимально просто - я не знаю.

  1. Самая первая мысль была заинжектить сервисы, и при сохранении записи вызывать методы обновления нужных полей из внедренного сервиса. У классов получается слишком сильная связанность. Этот вариант порождает циклическую зависимость - поэтому был исключен.

  2. Создание общего класса ItemOrderService (или фасада) в которые были вынесены все "общие" методы (updateItemAmount, syncOrderStatus etc.). Или наоборот создание подклассов типа SyncOrderStatus. Варианты в принципе рабочие, но почему то мне кажется это излишним и неправильным в моей ситуации.

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

  4. Инжектить сервисы в методы. Понятие не имею, чем аукнется такой подход

    public function changeStatus(Item $item, string $status): void
    {
       $item->update(['status' => $status]);
    
       (app(OrderServiceInterface::class))->syncStatus($item->order);
    }
    

По большей части перечисленные варианты - это попытка избежать сильной связанности этих двух классов. Я уже почти в полной уверенности, что причина этого в неправильном изначальном дизайне классов, однако я совсем не имею понятия каким образом это может быть реорганизованно. Буду очень рад если кто подтолкнёт в нужном направлении

Еще вопрос, нормально ли обновлять например какие то поля item в orderService?


Ответы (0 шт):