Skip to content

Feature Helpers

github-actions[bot] edited this page Jul 15, 2026 · 1 revision

🧰 Хелперы потока

← Возможности · Главная · Сравнение

CloudCastle\Support\Helpers — утилиты потока управления и работы со значениями: «прошить» объект побочным действием, лениво развернуть значение, проверить пустоту, повторить операцию с предикатом. Аналог глобальных функций illuminate/support (tap/with/blank/filled/retry), но в виде статических методов без глобального пространства имён.

Принцип работы

  • tap($value, $callback) — выполняет побочное действие над значением и возвращает само значение (удобно для fluent-цепочек и отладки).
  • with($value, ?$callback) — возвращает значение или результат его преобразования.
  • value($mayBeClosure, ...$args) — если передано замыкание, вызывает его; иначе возвращает как есть.
  • blank/filled — единая семантика «пустоты» для строк, массивов, null, чисел, объектов.
  • retry($times, $callback, $sleepMs, $when) — повторяет операцию до успеха или исчерпания попыток; предикат $when решает, повторять ли при конкретной ошибке.
use CloudCastle\Support\Helpers;

// tap — побочное действие, возвращает исходный объект
$user = Helpers::tap($user, static fn ($u) => $u->markActive());

// with — ленивое преобразование
Helpers::with('value', static fn (string $v): string => strtoupper($v)); // 'VALUE'

// blank / filled — единая проверка пустоты
Helpers::blank('   ');   // true
Helpers::blank(0);       // false (число — «заполнено»)
Helpers::filled(['x']);  // true

// retry — повтор с паузой и предикатом
$response = Helpers::retry(
    times: 3,
    callback: static fn (int $attempt): Response => $client->send($request),
    sleepMs: 200,
    when: static fn (Throwable $e): bool => $e instanceof NetworkException,
);

Плюсы

  • Единая, предсказуемая семантика пустоты (blank/filled) для всех типов.
  • retry с предикатом $when — точный контроль, какие ошибки повторять (идемпотентность для сетевых/временных сбоев).
  • Статические методы вместо глобальных функций — нет конфликтов имён.

Минусы

  • Не заменяет полноценный circuit breaker / backoff-стратегии — retry даёт фиксированную паузу между попытками.

✅ Рекомендуется

  • Повторять только идемпотентные операции; ограничивать $when конкретными восстановимыми ошибками.
  • Использовать tap для отладки цепочек без разрыва fluent-стиля.

❌ Антипаттерны

  • retry для неидемпотентных операций с деньгами без ключа идемпотентности — риск двойного списания.
  • Повторять любые исключения без $when — можно зациклить на неустранимой ошибке.

Схема retry

flowchart TD
    START["вызов callback(попытка)"] --> OK{"успех?"}
    OK -->|да| RET["вернуть результат"]
    OK -->|нет, исключение| LAST{"попытки исчерпаны или when()=false?"}
    LAST -->|да| THROW["пробросить исключение"]
    LAST -->|нет| SLEEP["пауза sleepMs"]
    SLEEP --> START
Loading

Сравнение с аналогами

Возможность Support illuminate symfony nette voku doctrine 🏆 Победитель
tap / with / value Support, illuminate
blank / filled Support, illuminate
retry с предикатом ошибки Support, illuminate

Clone this wiki locally