View brick

Поки відповідь — рядок у controller, HTML швидко стає нечитабельним: layout, форми, partials. addView() на ConceptStack дає ViewResponseFactory і шаблони замість конкатенації рядків. Потрібен уже увімкнений Http — view малює HTTP-відповідь. Повертає ViewBuilder: далі обираєш engine Twig або Plates (лише один — XOR). Мінімальна збірка — у рецепті HTML-сторінки.

Коли не додавати View: чистий JSON API. Тоді ErrorHandling краще з withJsonRenderer(), без Twig.

Методи ViewBuilder:

Метод Параметри Опис Залежність
setPaths() array<string, string> $paths Додаткові namespace → абсолютні шляхи до шаблонів —
setExtensions() list<class-string> $extensions Class-string список engine-extensions (Twig / Plates) —
setRouteNamespaces() array<string, string> $routeNamespaces Map route prefix → view namespace —
withTwig() — → ViewTwigBuilder Увімкнути Twig — (XOR з Plates, обов’язково один engine)
withPlates() — → ViewPlatesBuilder Увімкнути Plates — (XOR з Twig)

Методи ViewTwigBuilder (після withTwig()):

Метод Параметри Опис Залежність
setViewsPath() string $viewsPath Корінь шаблонів Twig — (обов’язково)
setCacheDir() string $cacheDir Каталог compiled cache; без нього — без filesystem cache —
setDebug() bool $debug = true Twig debug mode —
setDefaultExtension() string $defaultExtension Суфікс файла, якщо в імені шаблону його немає (default .twig) —

Методи ViewPlatesBuilder (після withPlates()):

Метод Параметри Опис Залежність
setViewsPath() string $viewsPath Корінь шаблонів Plates — (обов’язково)
setDefaultExtension() string $defaultExtension Суфікс файла (default .php) —

setPaths()

$stack->addView()
    ->setPaths([
        'admin' => $rootPath . 'resources/views/admin',
    ])
    ->withTwig()
    ->setViewsPath($rootPath . 'resources/views');

Коли шаблони живуть не лише в одному корені (адмінка, пакет, тема) — іменовані namespace уникають колізій імен. Основний корінь задає engine через setViewsPath(); setPaths() — додаткові корені для View registry.

setExtensions()

$stack->addView()
    ->setExtensions([AppTwigExtension::class])
    ->withTwig()
    ->setViewsPath($rootPath . 'resources/views');

Власні функції/фільтри Twig (або helpers Plates) без хаків у controller: class-string розширень resolve-яться з контейнера під час boot. Не плутати з setDefaultExtension() — то суфікс імені файла шаблону, не engine-extension.

setRouteNamespaces()

$stack->addView()
    ->setRouteNamespaces([
        'admin.' => 'admin',
    ])
    ->withTwig()
    ->setViewsPath($rootPath . 'resources/views');

Коли error renderer або glue підбирає каталог шаблонів за route name — map префікса імені маршруту → view namespace знімає if/else у коді. Для простої однієї поверхні можна не викликати.

withTwig()

$stack->addView()
    ->withTwig()
    ->setViewsPath($rootPath . 'resources/views')
    ->setCacheDir($rootPath . 'storage/cache/views')
    ->setDebug($debug);

Увімкнює extension-view-twig і повертає ViewTwigBuilder. У рецепті з кроку 7 після setViewsPath() додають setCacheDir() і setDebug($debug). Один engine на addView(): разом із withPlates() збірка не пройде — свідомий XOR, щоб не тримати два різні синтаксиси шаблонів у одному додатку.

Twig: setViewsPath()

Абсолютний шлях до основного кореня Twig (FilesystemLoader). Без нього збірка не пройде валідацію — engine не знає, де шукати index. Приклад — у кроці 2.

Twig: setCacheDir()

Compiled templates на диску прискорюють production. У рецепті вмикається з кроку 7 разом із setDebug($debug): при debug compile cache вимкнений (зручно при git checkout тегів), без debug — cache на диску. На кроках 2–6 рецепта setCacheDir не викликають — лише setViewsPath().

Twig: setDebug()

Увімкнює Twig debug (і DebugExtension у provider). Разом із setCacheDir() при true вимикає filesystem compile cache. У рецепті прив’язано до $debug (APP_DEBUG) з кроку 7 — той самий прапорець, що для Whoops у ErrorHandling, але це окремий параметр Twig builder-а.

Twig: setDefaultExtension()

$stack->addView()
    ->withTwig()
    ->setViewsPath($rootPath . 'resources/views')
    ->setDefaultExtension('.html.twig');

Щоб у controller писати create('index'), а не create('index.twig'): суфікс дописується, якщо його ще немає. Default у extension — .twig. Якщо передати повну назву з обраним суфіксом — повторно не дописується.

withPlates()

$stack->addView()
    ->withPlates()
    ->setViewsPath($rootPath . 'resources/views')
    ->setDefaultExtension('.php');

Альтернатива Twig: чистий PHP у шаблонах через extension-view-plates. Обирайте, коли команда вже на Plates або не хоче окремої мови шаблонів. XOR з withTwig().

Plates: setViewsPath()

Абсолютний корінь шаблонів Plates. Обов’язковий з тієї ж причини, що й у Twig: без шляху engine нічого не відмалює.

Plates: setDefaultExtension()

Суфікс файла (default .php). Той самий сенс, що й Twig setDefaultExtension(): коротші імена в ViewResponseFactory::create().

Рецепт з Twig — HTML-сторінки. Пакети: View, View Twig, View Plates.