Casting brick

HTTP віддає рядки; домен хоче int, bool, DTO. Без спільного caster кожен controller пише свій cast — і роз’їжджаються крайні випадки. addCasting() на ConceptStack реєструє extension-casting-valinor як CasterInterface і повертає CastingBuilder.

Capability опційна: FormRequest і Validation працюють без неї. Потрібна, коли FormRequest викликає toDto() або Http вмикає withTypedRouteParameters() (Stack require Casting). Рецепт — Casting і DTO.

Методи CastingBuilder:

Метод Параметри Опис Залежність
setCacheDir() string $cacheDirectory Каталог Valinor FileSystemCache —
setTransformers() list<class-string> $transformerClasses Custom Valinor converters —
setDebug() bool $debug = true FileWatchingCache у dev (перебудова при зміні DTO) —

setCacheDir()

$stack->addCasting()
    ->setCacheDir($rootPath . 'storage/cache/casting');

Без cache Valinor будує mapper на кожен запит — ок для мікро-демо, погано під навантаженням. Каталог має бути writable процесом PHP.

setTransformers()

$stack->addCasting()
    ->setTransformers([
        MyDateTimeConverter::class,
    ]);

Opt-in для доменних перетворень (дати, value objects), яких немає «з коробки». У базовому рецепті не потрібні — достатньо scalar + DTO з публічним конструктором.

setDebug()

$stack->addCasting()
    ->setCacheDir($rootPath . 'storage/cache/casting')
    ->setDebug(true);

У dev обгортає cache у FileWatchingCache: змінили DTO — mapper оновлюється без ручного очищення каталогу. На проді зазвичай false.

Хто споживає Caster

  • FormRequest — $dtoClass + toDto() (optional CasterInterface у factory) — основний сценарій рецепта
  • Http (opt-in) — withTypedRouteParameters() → явний cast route vars (DTO / суворіший fail на смітті в URL). Для простого int $id з числовим сегментом Reflection і так коерсить string→int без цього opt-in.

Мінімальний фрагмент

$stack->addCasting()
    ->setCacheDir($rootPath . 'storage/cache/casting')
    ->setDebug($debug);

$stack->addHttp()
    ->setRoutes([$rootPath . 'routes/web.php'])
    ->withFormRequests();

Рецепт — 10. Casting і DTO. Каталог — Bricks і addX(). Extension — Casting.