Closure function argument

91
19 марта 2021, 19:50

У меня есть метод класса, который обновляет ценовые предложения товара:

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);

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

READ ALSO
Многомерный масив по значению ключа

Многомерный масив по значению ключа

Как можно записать цену в переменную по значению ключа, например BTC, ETH, LTC смскрин: https://dl

89
Получить результат выполнения JavaScript кода в php

Получить результат выполнения JavaScript кода в php

Есть php скрипт который работает в фоне ( nohup php scriptphp & )

73
Java. Spring. TomCat

Java. Spring. TomCat

Пишу Spring-Web-MVC приложение

118
Удаление View полученных через LayoutInflater

Удаление View полученных через LayoutInflater

В моем приложении есть 2 активити, в каждом из которых я создаю список из View полученных через LayoutInflaterПри создании каждого view-пункта списка...

105