Например, есть удаленный API со следующими вызовами:
getGroupCapacity(group)
setGroupCapacity(group, quantity)
getNumberOfItemsInGroup(group)
addItemToGroup(group, item)
deleteItemFromGroup(group, item)
Задача состоит в том, чтобы добавить какой-либо элемент в какую-либо группу. Группы имеют вместимость.
Итак, сначала мы должны проверить, не заполнена ли группа. Если это так, увеличьте емкость, затем добавьте элемент. Примерно так (например, API выставляется с помощью SOAP):
function add_item($group, $item) {
$soap = new SoapClient(...);
$capacity = $soap->getGroupCapacity($group);
$itemsInGroup = $soap->getNumberOfItemsInGroup($group);
if ($itemsInGroup == $capacity) {
$soap->setGroupCapacity($group, $capacity + 1);
}
$soap->addItemToGroup($group, $item);
}
А что если addItemToGroup не удалось (элемент был плохим)? Нам нужно откатить возможности группы.
Теперь представьте, что вам нужно добавить 10 элементов в группу, а затем настроить добавленные элементы с некоторыми свойствами - и все это в одной транзакции. Это означает, что если это не удается где-то посередине, вы должны откатить все в предыдущее состояние.
Возможно ли это без набора кода IF и спагетти? Любая библиотека, фреймворк, шаблон или архитектурное решение, которое упростит такие операции (в PHP)?
UPD: SOAP - только пример. Решение должно соответствовать любому сервису, даже сырому TCP. Основной вопрос в том, как организовать транзакционное поведение с помощью базового нетранзакционного API.
UPD2: Полагаю, эта проблема практически одинакова во всех языках программирования. Поэтому приветствуются любые ответы, не только PHP.
Заранее спасибо!