Компонент содержит базовые классы контроллера, RouteCollection и Kernel.
Для адресации используется компонент Route и DI Container.
Все создаваемые контроллеры должны наследовать базовый класс Controller. Каждый action контроллера должен вернуть результат для выдачи в браузер, это может быть:
- объект Response
- объект Template
- массив (будет преобразован в JsonResponse)
- значение для вывода (строка, число, и т.п.)
Базовый класс контроллера имеет набор методов для типовых действий:
getRequest()
- получить объект RequestgetUrl()
- получить текущий URLgetSession($autostart = true)
- получить объект Session. Сессия стартует при первом вызове, если она явно не была запущена ранее.isAjax()
- проверка, что сделан Ajax-запрос. Альяс для$this->getRequest()->isXmlHttpRequest()
notFound()
- выбрасываетHttpException
с кодом 404forbidden()
- выбрасываетHttpException
c кодом 403
redirect($url, $status = null)
- возвращает объект RedirectResponse. По-умолчанию HTTP статус 302.back()
- редирект на HTTP_REFERER. Если HTTP_REFERER не указан, возвращает на главную страницу.
В системе используется шаблонизатор Plates, основанный на нативном синтаксисе PHP.
В контроллере предусмотрены методы для работы с шаблонами:
template($name, $data = null)
- Для создания объекта шаблонаrender($name, $data = null)
- Создание и рендер шаблона
При необходимости донастройки, можно получить объект Engine или полностью переопределить его:
getTemplatesEngine()
- получить объект EnginesetTemplatesEngine(Engine $engine)
- задать объект Engine
В комплекте также идут два расширения для Plates, упрощающие работу с всплывающими сообщениями (FlashBag) и URL.
При использовании полного фреймворка они включены по-умолчанию, а также расширение Asset
.
При подключении расширения SQRT\Plates\Extension\URL
в шаблоне добавляется метод url()
возвращающий
текущий объект URL. По-умолчанию в фреймворке передается объект URLImmutable.
При подключении расширения SQRT\Plates\Extension\DB
в шаблоне добавляется метод db()
возвращающий менеджер БД.
При подключении расширения SQRT\Plates\Extension\User
в шаблоне добавляется метод user()
возвращающий текущего
авторизованного пользователя.
В контроллере есть метод notice($message, $type = null)
добавляющий в сессию текущего пользователя всплывающее
сообщение. Такое сообщение один раз показывается пользователю и затем исчезает.
Можно получить все сообщения с помощью метода getNotices()
, являющегося альясом для $this->getSession()->getFlashBag()->all()
Сообщения группируются по типу, можно указывать произвольный тип, затем использовать его для оформления сообщений:
// Пример стандартного шаблона для отображения уведомлений
<?php foreach ($notices as $type => $messages): ?>
<?php foreach ($messages as $message): ?>
<div class="notice notice-<?= $type ?>"><?= $message ?></div>
<?php endforeach ?>
<?php endforeach ?>
Для упрощения, сделаны следующие альясы для трех, наиболее часто используемых ситуаций:
- Если
$type == null
=>info
- Если
$type === false
=>error
- Если
$type === true
=>success
Для отображения таких сообщений в шаблоне используется расширение SQRT\Plates\Extension\Notice
, в шаблоне добавляется методы:
notice($template)
- рендер шаблона$template
, в который будут передана переменная$notices
содержащая все уведомления.getNotices()
- получить массив всех уведомлений.
Для удобства работы с шаблоном страницы предусмотрен класс Layout - контейнер переменных для вывода в шаблон и набор хелперов.
Создать объект Layout можно вызвав метод layout($template = null)
в контроллере. После формирования страницы его можно
вернуть как результат работы контроллера. Контент страницы задается с помощью setContent($content)
.
title()
- рендер тега<title>
, заданного черезsetTitle
. Также можно задать sprintf-шаблон черезsetTitleTmpl
header()
- рендер заголовка страницы. заданного черезsetHeader
. Если header не указан, используется значение title.keywords()
- рендер META-тега keywords, заданного черезsetKeywords
. Если значение не задано, по-умолчанию выводится значение title, но можно указать значение черезsetDefaultKeywords
.description()
- рендер META-тега description. Функционально аналогичен keywords.addJS()
- добавить js в массив скриптов, который можно получить черезgetJS()
.addCSS()
- добавить css в массив стилей, который можно получить черезgetCSS()
.
При наследовании можно переопределить метод init()
для настройки.