View
Triangle View превращает шаблон и данные в HTTP-ответ. Компонент предоставляет функции view/raw_view/blade_view/think_view/twig_view, выбор render handler и данные текущего request. Он работает с Raw PHP, Blade, Twig и ThinkPHP; конкретный сторонний движок устанавливается отдельно.
Установка и выбор движка
Заголовок раздела «Установка и выбор движка»composer require triangle/viewТребуются PHP ^8.1 и triangle/engine ^8.1. В view.php параметр handler выбирается по VIEW_HANDLER: raw по умолчанию, blade, think или twig. Неизвестное значение вызывает ошибку match, а не переключение на Raw.
Пакет не объявляет Twig/Blade/ThinkPHP обязательными зависимостями. Соответствующие render-классы обращаются к Twig Environment, Jenssegers Blade или think Template. Подключите совместимую версию движка в приложении до его выбора.
Ответ из контроллера
Заголовок раздела «Ответ из контроллера»return view('account/profile', [ 'displayName' => 'Reader',]);В обычном приложении с пустым app и стандартной конфигурацией Raw это файл app/view/account/profile.phtml. Суффикс берётся из view.options.view_suffix; поставляемое значение — phtml.
Raw-шаблон:
<h1><?= htmlspecialchars($displayName, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') ?></h1>Raw исполняет PHP и сам не экранирует вывод. Передавайте в него доверенный шаблон и явно экранируйте пользовательские значения под контекст HTML/атрибута/URL. Имя шаблона и app/plugin не должны выбираться из непроверенного пути пользователя.
Как определяется путь
Заголовок раздела «Как определяется путь»Относительное имя ищется в app/view, а при непустом имени приложения — в app/{app}/view. Для плагина базой становится plugin/{plugin}/app. Имя с начальным / отсчитывается от корня проекта, а не от корня файловой системы.
При template=null helper пытается получить имя из controller и action текущего request: controller преобразуется в путь view, CamelCase — в snake_case. Вне контроллера задавайте template явно; пустая строка не является обозначением «автоматический шаблон».
Blade использует имена и правила собственного движка, а не просто дописывает view_suffix как Raw/Twig/ThinkPHP. Для Twig и Blade создаётся кеш экземпляров по пути шаблонов; изменение options в работающем процессе не обязательно перестроит уже созданный экземпляр.
Данные текущего запроса
Заголовок раздела «Данные текущего запроса»use Triangle\View\Support\View;
View::assign('displayName', 'Reader');$variables = View::vars();Правильное имя класса — Triangle\View\Support\View. Данные assign хранятся в request->_view_vars. Это изоляция по объекту запроса, а не глобальное состояние пользователей. Twig, Blade и ThinkPHP объединяют их с явными vars; явные значения имеют приоритет.
У Raw есть отличие: render не получает локальную переменную request перед проверкой _view_vars, поэтому данные assign не извлекаются этим путём. Для Raw передавайте данные непосредственно вторым аргументом view/raw_view. View::vars при этом продолжает возвращать записанные данные текущего request.
До и после шаблона
Заголовок раздела «До и после шаблона»Raw читает view.options.pre_renders и post_renders. Унаследованные списки pre/post хранятся статически и дополняются при каждом render. Getter post ошибочно читает список pre; array_unique применяется к массивам описаний шаблонов и может выдавать предупреждения о преобразовании Array в string.
Не используйте эти списки как надёжный per-request layout-механизм до отдельного исправления. Для Raw объединяйте части в своём доверенном шаблоне, а для внешнего движка используйте его штатные layouts/includes.
Отсутствующий шаблон и ошибки
Заголовок раздела «Отсутствующий шаблон и ошибки»Raw пропускает отсутствующий файл через file_exists: результат может быть пустой строкой без исключения. Проверьте путь, app/plugin и view_suffix прежде, чем искать проблему в HTTP-слое.
Исключение во время include очищает Raw output buffer и передаётся выше. Внешние движки используют собственные ошибки loader/syntax/runtime. Не перехватывайте любую такую ошибку с успешным пустым ответом: ошибки шаблона должны попадать в закрытую диагностику приложения.
Функции ответа
Заголовок раздела «Функции ответа»| Вызов | Поведение |
|---|---|
view(template = null, vars = [], app = null, plugin = null, http_code = 200) | Triangle Response с выбранным config handler |
raw_view(template = null, vars = [], app = null, plugin = null) | Raw Response, статус 200 |
blade_view(...) | Blade Response, статус 200 |
think_view(...) | ThinkPHP Response, статус 200 |
twig_view(...) | Twig Response, статус 200 |
responseView(data, status = null, headers = []) | Ответ через системный Raw-шаблон success/error |
Если первый аргумент view — массив, он становится vars, а template определяется автоматически. Для нестандартного статуса используйте пятый аргумент view. Функции специализированных движков этого аргумента не имеют.
ResponseView выбирает success только при статусе 200, иначе error. Если исходный status равен 200 или 500 и data.status — числовое значение от 100 до 599, оно заменяет status. Параметр status=null не является явным успешным статусом: передавайте требуемый код.
Рендереры
Заголовок раздела «Рендереры»RenderInterface::render(string $template, array $vars, string $app = null): string задаёт минимальный контракт. Реализации Raw/Blade/ThinkPHP/Twig дополнительно принимают plugin. Сам интерфейс не описывает поддержку assign, vars, pre/post или plugin; custom handler для всех helper-вызовов должен обеспечивать используемые приложением методы.
AbstractRender предоставляет assign, vars, build, addPreRender/getPreRenders, addPostRender/getPostRenders. Assign поддерживает массив либо name/value; необязательный merge_recursive включает array_merge_recursive, которое при совпадении скалярных ключей создаёт массив значений, а не просто заменяет старое значение.
Build вычисляет путь из template/app/plugin и view.options.view_suffix. Он не проверяет, находится ли полученный путь внутри разрешённой директории: template и параметры пути должны быть доверенными.
Настройки движков
Заголовок раздела «Настройки движков»| Движок | Особенности |
|---|---|
| Raw | PHP include; options.vars и явные vars; нет автоматического escaping |
| Twig | FilesystemLoader и Environment; options передаются Environment; extension callback вызывается при создании кешированного экземпляра |
| Blade | Jenssegers Blade, compiled cache в runtime/views; extension callback при создании экземпляра |
| ThinkPHP | Новый think Template на render; view_path/cache_path/view_suffix объединяются с options |
У plugin собственные настройки через {plugin_alias}.{plugin}.view; стандартный alias — plugin. Некоторые вычисления автоматического template используют буквальный plugin prefix, поэтому изменение alias требует отдельной проверки соответствующего пути.
Системные шаблоны
Заголовок раздела «Системные шаблоны»Raw::renderSys(string $template, array $vars): false|string берёт путь из view.templates.system.{template}, иначе использует Templates/{template}.phtml пакета. В отличие от обычного Raw render здесь получается текущий request и извлекаются назначенные vars. Наличие поставляемого шаблона проверяйте в установленном пакете; fallback-путь не гарантирует файл.