Как заблокировать изменение состояния транзакции заказа?

Я имею дело с плагином Shopware6 для платежного шлюза. Мне нужно обработать изменение состояния транзакции заказа. В одном из моих случаев я хотел бы предотвратить изменение состояния в Refunded для транзакции заказа, когда я пытаюсь выполнить возмещение поставщику платежа и получаю сообщение об ошибке.

Нашел этот метод \Shopware\Core\System\StateMachine\StateMachineRegistry::transition

public function transition(Transition $transition, Context $context): StateMachineStateCollection
{
  ...
  $repository->upsert($data, $context);
  ...
  $this->eventDispatcher->dispatch(new StateMachineTransitionEvent(...));
  ...
  $this->eventDispatcher->dispatch(...);
  ...
  $this->eventDispatcher->dispatch(...);
  ...
}

где отправляется более одного события, но все они после upsert.

Даже если я подниму исключение в подписчике этих событий, upsert уже обновил таблицу db, и у меня нет возможности отменить его, особенно потому, что состояние Refunded не является состоянием выхода.

Как я могу предотвратить или отменить апсерт?


person miroku    schedule 13.10.2020    source источник


Ответы (1)


Вы можете отменить апсерт. Для этого вам нужно будет написать новый переход в базу данных.

Вам нужна таблица state_machine_transition, а информацию о том, как данные записываются в эту таблицу, можно найти в разделе platform/src/Core/Migration/Migration1536233560BasicData.php@1078. Вам нужно будет сделать это при миграции вашего плагина.

Затем вы можете снова перейти в состояние после того, как оно было изменено на ваш крайний регистр.

person LastSgt    schedule 03.11.2020