У меня есть метод класса, который обновляет ценовые предложения товара:
public function updatePrices(int $productId, array $arPrices, ?Closure
$beforeUpdate, ?Closure $afterUpdate) : void
{
# update ..
}
Возникла потребность, в некоторых случаях выполнять какие-то действия до и после выполнения кода обновления цены.
Хотелось бы это реализовать через callback.
т.е. методу нужно 2 дополнительных параметра, в которые можно будет передавать анонимную функцию и в этих функциях должен быть доступ к $productId и $arPrices.
Т.е. 2 события, beforeUpdate и afterUpdate, в beforeUpdate должна быть возможность модификации массива $arPrices или отмены обновления.
Как я себе это представляю (вероятно код неправильный):
public function updatePrices(int $productId, array $arPrices,
?Closure $beforeUpdate, ?Closure $afterUpdate) : void
{
if($beforeUpdate !== null) {
$modifyArPrices = $beforeUpdate($productId, $arPrices);
if($modifyArPrices == null) { # отменяем обновление цен
return;
}
$arPrices = $modifyArPrices; # Возвращаем модицифированный массив цен
}
# update ..
if($afterUpdate !== null) {
$afterUpdate($productId, $arPrices);
}
}
При необходимости пишу так:
$this->updatePrices(1, ["BASE_PRICE" => 123],
function (int $productId, array $arPrices) : ?array {
# Выполняю какие-то действия, при необходимости изменяю и возвращаю массив $arPrices
# или
# return null; # для того, чтобы отменить изменения цен
}, null);
Подскажите пожалуйста, как будет выглядеть рабочий код. Как это делается? И как решаются подобные задачи правильным образом, с точки зрения архитектуры?
Продвижение своими сайтами как стратегия роста и независимости