Установка и обновление: использование Composer
Настройка прав доступа к фреймворку в Linux
Установка и настройка: вариативное включение debug-режима
Настройка: Изменить папку public проекта на другую
Настройка: Изменить название директории vendor
Настройка: Внедрение собственного кода при загрузке фреймворка.
Маршрутизация: установка формата для адреса
Маршрутизация: использование переменных в файлах роутов
Маршрутизация: работа с поддоменами
Дополнительные константы для предварительной настройки
Модули: возможность модульной разработки
Памятка: защита проекта на фреймворке HLEB
Использование Content Security Policy
Использование отладочной панели Debug Panel
Маршрутизация: регулярное выражение для динамических значений
Объект Request: данные динамического маршрута
Объект Request: обработка внешних данных
Шаблоны: использование includeTemplate
Шаблоны: кэширование при помощи includeCachedTemplate
Консоль: использование собственных консольных команд
Консоль: пример запуска команд в определённое время
Реализация нескольких точек входа
Admin Panel: простая административная панель
Radjax: быстрый вспомогательный роутер
Шаблонизатор Twig: подключение
Мьютексы (Mutexes): установка и использование
Контроллеры: перенос общих данных
Установка и обновление: использование Composer
Установить актуальную версию проекта при помощи консольной команды (требует установленный менеджер пакетов Composer):Обновить только ядро фреймворка (выполнить из папки с установленным проектом):
Если нужно обновить зависимости:
Настройка прав доступа к фреймворку в Linux
После установки фреймворка HLEB для Linux необходимо настроить права. Для этого нужно знать имя группы веб-сервера. Далее предложен вариант, как установить расширенные права на редактирование файлов в папке /storage/ проекта.Веб-сервер может носить имя www-data, а его группа может быть одноимённая www-data. При запуске фреймворка, если права ещё не заданы, будет выведена ошибка с попыткой определить имя и группу активного веб-сервера.
Чтобы новые файлы, создаваемые веб-сервером, могли редактироваться через консоль текущим пользователем, необходимо добавить его в группу веб-сервера:
После этих изменений в составе группы, чтобы изменения применились, необходимо разлогиниться и снова залогиниться в системе под этим пользователем, или выполнить следующую команду:
Следующая проверка должна вывести 'www-data' в списке групп:
Затем расширить права на папку /storage/ для группы (из корневой директории проекта).
Установка и настройка: вариативное включение debug-режима
Несмотря на то, что для тестовой версии проекта и итоговой устанавливаются разные настройки в конфигурационном файле start.hleb.php, иногда бывает необходимо опционально включить debug-режим или другие настройки в публичной версии. Это можно реализовать двумя способами - переключить опционально на тестовый конфигурационный файл в /public/index.php или установить условие в файле start.hleb.php, например по определенномуip-адресу. Естественно, с этого адреса доступ может быть только у необходимого круга лиц.Настройка: Изменить папку public проекта на другую
Чтобы установить вместо папки "public" другую, например, "public_html" - необходимо в корневом файле "console" изменить строчку:Настройка: Изменить название директории vendor
Для изменения названия папки "vendor" с библиотеками проекта, например, на "lib", в корневом файле "console" изменить в строчке:Настройка: Внедрение собственного кода при загрузке фреймворка.
Бывает так, что при загрузке фреймворка необходимо задать собственные правила или выполнить определенный код. Добавлять его в специализированные файлы вроде "index.php", "aliases.php" или "shell.php" не совсем правильно, для предзагрузки существуют Middleware, что сделает эти правила более гибкими.Маршрутизация: установка формата для адреса
Переданные с контроллером значения можно использовать для различных целей, например, для назначения локали и/или формата данных.Маршрутизация: использование переменных в файлах роутов
Так как карта маршрутизации содержит обычный код PHP, то допустимо использовать все его возможности с единственным ограничением: без использования внешних данных. Например, задание переменных:Маршрутизация: работа с поддоменами
Задать правила для поддоменов, а также, при надобности, для домена любого уровня, помогут два метода маршрутизации: domain() и domainTemplate().Привязка маршрутов осуществляется без формального разделения на домен и поддомены, только по уровням иерархии доменного имени, начиная от домена верхнего уровня. В комментариях к этим примерам "site.com" аналогичен любым вариантам домена второго и первого уровня.
Метод domainTemplate() отличается только тем, что в первом аргументе передаются значения для проверки на совпадение в регулярном выражении.
Для кириллических поддоменов возможно придётся задавать условия только после конвертации названия поддоменов в Punycode.
Дополнительные константы для предварительной настройки
Приведённые здесь константы (HLEB_PROJECT_ONLY_HTTPS, HLEB_PROJECT_GLUE_WITH_WWW) необходимо разместить в файле настроек проекта hleb.start.php для того, чтобы быстро настроить и продемонстрировать соответствующие свойства проекта и/или проект часто переносится и нет возможности заменить на серверные настройки. Настройка на стороне сервера рекомендуется в большинстве случаев и может конфликтовать с данными установками, если применяется вместе с ними./* |----------------------------------------------------------------------------- | Demo redirection from "http" to "https". | | Демонстрационное перенаправление с "http" на "https". | */
/* |----------------------------------------------------------------------------- | Demo URL redirection from "www" to without "www" and back 0/1/2. | | Демонстрационное перенаправление URL с "www" на без "www" и обратно 0/1/2. | */
/* |----------------------------------------------------------------------------- | Allows to enable (true) / disable (false) template caching. | | Позволяет включить (true) / выключить (false) кэширование шаблонов. | */
/* |----------------------------------------------------------------------------- | Enables writing SQL queries to a log file. | | Включает запись SQL-запросов в лог-файл. | */
/* |----------------------------------------------------------------------------- | Using Sessions in a project. | | Глобальное включение Session в проекте. | */
По умолчанию включено (true).
/* |----------------------------------------------------------------------------- | Automatic cache update on changes in route files. | | Автоматическое обновление кеша при изменениях в файлах маршрутов. | */
/* |----------------------------------------------------------------------------- | Sets the default timezone used by all date/time functions in a script. | | Устанавливает часовой пояс по умолчанию для всех функций даты/времени в скрипте. | */
/* |----------------------------------------------------------------------------- | Adds the current domain to the name of the log file. | | Добавляет в название файла логов текущий домен. | */
/* |----------------------------------------------------------------------------- | Restricts the action of HLEB_PROJECT_ENDING_URL to only the specified HTTP methods. | | Ограничивает действие HLEB_PROJECT_ENDING_URL только на указанные HTTP-методы. | */
Модули: возможности модульной разработки
Модульная разработка не нарушает базовый принцип MVC фреймворка. Для работы с его компонентами, в рамках изолированного модуля, не всегда удобно переключаться по папкам разных частей проекта. Поэтому предусмотрен вариант, когда все файлы разрабатываемого модуля расположены рядом. Отличие состоит в том, чтобы вместо метода controller() в маршрутизаторе использовать метод module().Дополнительно необходимо создать папку "/modules" в корневой папке проекта. В ней будут располагаться модули с возможностью различного уровня вложенности.
/modules
/example
/DefaultModuleController.php
/content.php
/templates
/origin.php
Все составляющие элементы используют внутренние ссылки на папку "modules".
Функция view() в данном случае также указывает на папку с текущим модулем "/modules/example".
Пространство имён зависит от пути до файла контроллера, как в приведённом примере:
/modules
/example
/attachment
/DefaultModuleController.php
/content.php
/templates
/origin.php
Роутинг будет выглядеть вот так:
Для модулей также, как и для контроллеров, возможно использование произвольных значений в названии контроллера модуля и метода из url.
Памятка: защита проекта на фреймворке HLEB
1 Отправка форм и ajax-запросов1.1 Добавить в форму и/или запрос CSRF-защиту, предусмотренную фреймворком. Об этом здесь. Проверить, запросив с неправильным токеном и валидным.
1.2 Отправлять данные POST-методом.
2 DEBUG-режим
2.1 Использовать DEBUG-режим только при разработке.
2.2 Проект с запущенным DEBUG-режимом НЕ должен быть в свободном доступе из сети Интернет. Даже если на сайте все страницы без контента, специфический вывод панели отладки может спровоцировать нежелательный интерес со стороны сканирующих ботов.
3 Уникальный идентификатор проекта и кеш
3.1 При копировании проекта для иных целей, путем прямого переноса из папки, рекомендуется в перенесённой(!) конечной копии очистить данные в папках "storage/cache/key", "storage/public" и "storage/logs". В общем, везде, где хранится кеш с подразумеваемым его удалением.
4 Очистка входящих данных
4.1 Ограничивайте внешние данные по принципу "что не разрешено, то запрещено".
4.2 Используйте специальные методы маршрутов с регулярным выражением(where([...])), чтобы лишние символы отбрасывались уже на этом уровне. В константе HLEB_PROJECT_VALIDITY_URL также можно ограничить допустимые символы в маршрутах для всего проекта.
4.3 Старайтесь не использовать GET-параметры для получения пользовательских данных, для этого должно хватить возможностей маршрутизации. Используйте методы объекта Request для получения очищенных параметров всех типов.
4.4 Основное внимание нужно обратить на то, чтобы пользовательские данные не попадали напрямую в базу данных (защита от SQL-инъекций), например, используя PDO. И также код JavaScript, а лучше любой код в тегах, был особым образом обработан при самом поступлении данных. Если производится запись в базу данных, то рекомендуется хранить пользовательские данные в необработанном виде, применяется лишь отделение данных от запроса (например, средствами PDO). А при выводе нежелательные теги преобразовывать в спецсимволы или иным образом обезопасить контент.
4.5 Указание кодировки каждой веб-страницы должно быть обязательным (в основном это кодировка UTF-8). Так данные будут интерпретированы в ожидаемом виде.
4.6 Использовать Content Security Policy (CSP). Это заголовок, который позволяет в явном виде объявить разрешённый список источников, с которых можно подгружать различные данные, например, JS, CSS, JPG и тд.
4.7 Запретите вставку страниц проекта в сторонние фреймы, если это не задумано заранее, минимальная защита представлена заголовком X-Frame-Options в файле index.php в публичной директории проекта.
5 Безопасность используемых данных
5.1 Настройте права доступа для веб-сервера и командной строки (в UNIX-системах), добавив владельца проекта в группу веб-сервера и разрешив этой группе полный доступ к папке /storage/.
5.2 Выставите значения для cookies в php.ini (session.use_cookies=On, session.use_only_cookies=On, session.cookie_httponly=On, session.cookie_secure=On) и убедитесь, что вам известно, какие условия будут выполняться при этом.
Использование Content Security Policy
Директива Content Security Policy устанавливает различные степени защиты в браузере, при использовании максимального уровня защиты, при котором не разрешается использовать встроенные на странице стили и скрипты, может неправильно отображаться отладочная панель в режиме DEBUG. Обойти это можно следующим способом, добавив политику CSP в виде исключения в конце файла конфигурации:Использование отладочной панели Debug Panel
В микрофреймворк HLEB добавлена отладочная панель, активная только в DEBUG-режиме. Она подключается при помощи строки:MyDebug
Создав класс FirstBefore или любым подобным способом:Теперь в отладочной панели появятся четыре дополнительные вкладки с параметрами, при условии, что этот класс подключён в карте маршрутов перед проверяемыми маршрутами.
Маршрутизация: регулярное выражение для динамических значений
Регулярное выражение в методе where() может принимать различные условия, в рамках правил составления регулярных выражений, например:Объект Request: данные динамического маршрута
Объект Request содержит значения из URL по совпадению с динамическим маршрутом. Например, при запросе "site.com/first/" и наличии маршрута:Объект Request: обработка данных запроса
Через методы объекта Request (Hleb\Constructor\Handlers\Request) также можно получить различные данные пользовательского запроса.Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
Request::
<?php getRequestHead()->
Request::
Request::
<?php print getRequestResources()->
<?php print getRequestResources()->
Шаблоны: использование includeTemplate
Части кода в подключаемых файлах папки views могут повторятся. Чтобы вынести их в отдельный шаблон, независимый от окружающего контента, используется функция includeTemplate(), первым аргументом которой указывается название шаблона из папкиДанные шаблоны могут обращаться только к ".php" файлам, поэтому они не используются при работе с шаблонизатором (Twig), который включает собственные способы управления контентом.
Шаблоны: кэширование при помощи includeCachedTemplate и includeOwnCachedTemplate
В отдельных случаях, если содержимое шаблона требует существенных расчётов, но данные неизменны некоторое время, есть возможность задать кэширование. Чем больше производительности требуют эти вычисления, тем больший прирост в скорости обработки блока можно получить при последующих обращениях, так как в кэше он сохранен как обычный html-текст.Кэширование будет привязано к заданному времени в методе setCacheTime(), который необходимо расположить в шаблоне для функции includeCachedTemplate(). Аргументы последней идентичны функции includeTemplate(), единственное отличие, что заданное в шаблоне время кэширования приведет к кэшированию содержимого. Все изменения содержимого шаблона будут недоступны до истечения указанного срока. Также следует учесть, если шаблон задан через аналогичную функцию includeOwnCachedTemplate() и в нём установлено время кэширования, то где бы он не был использован в проекте, кэшированное значение его будет для текущего пользователя одинаковым. Таким образом функция includeOwnCachedTemplate отличается от includeCachedTemplate привязкой к пользовательской сессии, что ведёт к значительному увеличению размера кэша, а также более низкой его эффективности, но зато позволяет включать в кэш пользовательские данные.
Кэширование должно быть рациональным и обдуманно применено в каждом случае, иначе результат может слишком явно не соответствовать вычисляемым данным. Например, рекомендуется кэшировать блоки, содержащие информацию, которая рассчитывается из текущего названия месяца или ежедневно обновляемого курса валют. Но и в таком случае значение желательно устанавливать не более 10 минут (600 секунд).
Если это определение без особых затрат производительности, вроде прямого получения даты из PHP-функции date(), то эффективности от кэширования не будет.
Также, при использовании дополнительно передаваемых параметров во втором аргументе данных функций, возможно отсутствие пользы от кеширования, если эти параметры часто изменяются. Для каждого варианта из этих параметров будет создан собственный соответствующий кэш.
В случае возникновения каких-либо сомнений при использовании этой функции, лучше заменить её на функцию includeTemplate().
Для удаления всего кэша шаблонов - удалить содержимое папки /storage/cache/templates/ или специальной консольной командой.
Консоль: использование собственных консольных команд
Перечень встроенных консольных команд отображается командой php console --help, выполненной в корневой директории проекта.--version or -v (displays the version of the framework) (версия фреймворка)
--clear-cache or -cc (clears the templates) (очистка кэша шаблонов и маршрутов)
--forced-cc (forcefully clears the templates)
--clear-routes-cache or -routes-cc (clear route cache)
--update-routes-cache or -routes-upd (update route cache)
--info or -i (displays the values of the main settings) (вывод настроек)
--help or -h (displays a list of default console actions)
--routes or -r (forms a list of routes)
--list or -l (forms a list of commands) (вывод списка пользовательских команд)
--list <command> [--help] (command info)
--logs or -lg (prints multiple trailing lines from a log file) (отображение последних ошибок в логах)
--find-route <url> [method] [domain] (route search by url)
--new-task (сreates a new command)
--new-task example-task "Short description" (Создание новой команды)
Создать собственную консольную команду при помощи добавления соответствующего класса в app/Commands/:
Добавление произвольного значения "test", которое будет передано в переменной $arg :
Если необходимо передать два или более аргументов с командой, то их необходимо указать в методе execute, например так: execute($arg1, $arg2, $arg3).
Передача именованных параметров, например:
При добавлении аргумента --quiet после пользовательской консольной команды отключается вывод данных.
Чтобы выполнить конкретную команду внутри другой или в коде приложения, нужно вызвать метод call(). Это может быть как (new DefaultTask())->call(['arg1' => 'value1', 'arg2' => 'value2']) или (new DefaultTask())->call(['test']) для приведённых выше примеров.
Консоль: пример запуска команд в определённое время
Если выполнение команд происходит при помощи cron, с 1.2.3 версии фреймворка добавлена возможность собрать несколько команд в одной основной и запускать в зависимости от назначенного времени. B cron указывается только выполнение основной команды, каждую минуту. Таким образом, при переносе проекта, достаточно задать одну команду на выполнение. Например, в основной команде systematic-launch-task заданы две исполняемые команды.Первоначальный вариант:
Подробный перечень методов, задающих время выполнения, можно найти в классе MainLaunchTask, от которого унаследован основной класс. Методы, определяющие конкретные минуты, могут принимать список этих команд в виде массива, остальные могут служить условием запуска.
everyMinute(<commands>) - каждую минуту.
everyHour(<commands>) - каждое начало часа.
everyDay(<commands>) - каждый день в 00:00.
givenMinutes(<minute>, <commands>) - первым аргументом минуты часа (0-60) в массиве или числовое значение.
givenHour(<hour>) - часы (0-12) в массиве или числовое значение.
givenMonth(<month>) - месяцы (1-12) в массиве или числовое значение.
givenWeeklyDay(<day>) - значения дня недели (1-7) в массиве или числовое значение.
givenMonthlyDay(<day>) - значения дня месяца (1-31) в массиве или числовое значение.
givenYearDay(<day>) - значения дня года (1-365) в массиве или числовое значение.
Реализация нескольких точек входа
По умолчанию точкой входа в приложение является /public/index.php. Так как загрузочный файл запускается из этого индексного файла, то изменить название публичной папки проекта легко - просто переименовав её и направив на неё веб-сервер, подробнее.Например, необходимо создать отдельную папку для независимой front-разработки на поддомене основного сайта (точки входа). Скопируйте папку /public/ и, для наглядности сохраните в новую папку /dev/ в корневой директории проекта, дополнительно переименовав в /public_html/.
В эту директорию /dev/public_html/ нужно направить необходимый поддомен. Если это директория разработки, то прежде необходимо поставить на нее пароль.
Теперь, открыв файл /dev/public_html/index.php нужно добавить следующие изменения для того, чтобы фреймворк обнаружил необходимые ресурсы.
Далее, возможно назначить собственные конфигурационные файлы для этой папки и также дополнительно отдельную папку /storage/ (скопированную из оригинальной) с выводом логов и кешированием. Чтобы продемонстрировать полностью возможности раздельных точек входа, скопируем в эту же папку файл ./console из корневой директории. Получим следующую структуру:
/dev/
/public_html/
/css/
/images/
/js/
/svg/
/.htaccess
/favicon.ico
/index.php
/robots.txt
/storage/
/console
/dbase.config.php
/start.hleb.php
Для работы этой структуры нужно внести некоторые изменения в /dev/public_html/index.php и /dev/console:
Запрос консольной команды к текущей точке проекта будет таким из корневой папки:
Admin Panel: простая административная панель
В версии 1.1.5 фреймворка добавлен новый метод маршрутизации adminPanController(). Он необходим для использования библиотеки phphleb/adminpan, которая подключается отдельно.Метод adminPanController() аналогичен методу controller(), с той разницей, что отображаемый им контент будет встроен в оболочку административной панели.
К странице в дальнейшем допустимо подключить какой-нибудь СSS- и/или JS-фреймворк в коде подключаемого контента.
Кроме того, можно воспользоваться встроенными инструментами формирования таблиц и списков.
Radjax: быстрый вспомогательный роутер
Данный маршрутизатор не включен в основной пакет фреймворка, его можно установить через Composer:После установки остается только назначить роуты в файле /routes/rajax.php проекта. Эти роуты просты и отличаются от роутов фреймворка HLEB. В них присутствует один метод get(), через который и настраивается конфигурация, все эти методы первоочередны по отношению к стандартным маршрутам фреймворка. Следует отметить, что, кроме этих отличий, есть ещё несколько:
1) Если тип маршрута (GET, POST и тд.) из конфигурации не подходит, нo адрес маршрута совпал, Radjax-роутер не пропустит поиск далее, как это реализовано во фреймворке, а выдаст ошибку 405 (метод не поддерживается) c перечислением корректных для этого маршрута типов в заголовке.
2) Константы для настроек фреймворка (/start.hleb.php) также влияют на код Radjax-роутера, хотя он функционирует независимо и запускается отдельно от фреймворка, из-за чего его производительность выше. В большинстве, от роутера такого типа, требуется только получить или сохранить данные по запросу и отобразить ответ в виде json или xml.
3) Radjax может проверять токен, генерируемый фреймворком для защиты от CSRF-атак, если включен параметр protected данного роутера, но не устанавливает токен самостоятельно. Поэтому, используемый для ajax-запросов роутер проверяет существующий токен, как минимум уже установленный в сессию на странице, с которой был выполнен запрос. При использовании роутера как API, параметр protected следует отключить, чтобы сторонние ресурсы могли запрашивать данные. Дубликат токена для проверки добавляется со страницы GET- или POST-параметром "_token".
4) Файл /routes/radjax.php может включать только специальные роуты Radjax, этот файл не нужно инклюдировать в файл /routes/main.php, как в случае с другими файлами роутинга фреймворка.
5) Класс контроллера указывается полностью, вместе с его namespace, например, "App\Controllers\Api\MainController", а при не обнаружении метода класса, указанного после знака "@", поиск продолжается по указанному методу с добавлением приставки "Http{Type}", где Type это текущий тип HTTP запроса. Например, для "App\Controllers\Api\MainController@test" и указанием поддерживаемого типа ["post"], в соответствующем классе сначала будет произведен поиск метода test(), а если он не будет найден, то testHttpPost().
6) По умолчанию реализовано чтение файлов сессий, но не их сохранение, это улучшает обработку конкурентных ajax-запросов. Однако, возможность сохранения изменений в сессию можно включить в конфигурации роута, указав "save_session" => true.
Чтобы использовать только Radjax-роутер в проекте необходимо назначить константу HLEB_ONLY_RADJAX_ROUTES и присвоить ей значение true. После этого стандартный роутинг будет отключен, несуществующие страницы будут выдавать 404-ошибку чуть быстрее и можно будет продолжить пользоваться некоторыми другими возможностями фреймворка: объектом Request, DB и консольными командами.
Шаблонизатор Twig: установка
При желании можно подключить к фреймворку шаблонизатор Twig. Он будет работать через автозагрузку классов, генерируемую Composer.Шаблонизатор Twig: настройка
После установки, если указать расширение файла в функции view() маршрута или контроллера, файл будет передан в обработку Twig. Иначе он будет выполнен как обычный PHP-файл.HLEB_TEMPLATE_CACHE (bool), включение кеширования для всех шаблонов. По умолчанию включено.
HL_TWIG_AUTO_RELOAD (bool), автоматическая перекомпиляция шаблонов. Изначально ориентировано на режим отладки.
HL_TWIG_STRICT_VARIABLES (bool), включение строгого режима, при котором будут выдаваться ошибки, если существующая переменная не передана в шаблон. По умолчанию отключено.
Мьютексы (Mutexes): установка и использование
Необходима версия PHP >= 7.4Использование мьютекса оправдано в случае, если необходимо заблокировать доступ к какому либо коду, пока он не будет выполнен в текущем процессе или по истечении заданного времени блокировки. Например, дублирующиеся одновременные запросы по API, могут вызвать параллельную запись в базу данных одного и того же значения. Чтобы этого не произошло, участок кода, ответственный за запись, необходимо обернуть в методы мьютекса. Их всего три - acquire, release и unlock.
Установка и назначение консольных команд (php console mutex/mutex-db-stat-task, php console mutex/mutex-predis-stat-task и php console mutex/mutex-file-stat-task):
FileMutex
Собственная конфигурация мьютекса(устанавливается один раз):
DbMutex
Блокировки с сохранением состояния в базе данных - аналогичная реализация мьютексов. Используются такие-же методы acquire, release и unlock, а также подключение собственной конфигурации. Отличие заключается в классе, который используется при инициализации мьютекса.
Подключение к базе данных по умолчанию используется стандартное для фреймворка, если не указано иное в константе HLEB_MUTEX_TYPE_DB конфигурации.
PredisMutex
Аналогичная реализация мьютексов при помощи Redis (библиотеки predis/predis). По умолчанию параметры конфигурации берутся из константы HLEB_MUTEX_TYPE_REDIS или HLEB_TYPE_DB (database/dbase.config.php).
Логирование: PSR-3 Logger
Функция Logger() возвращает объект с различными уровнями логирования, например Logger()->error('Error message').Текущий логгер сохраняет логи в файлы, в том числе исключения и предупреждения PHP. Можно создать собственный логер на основе интерфейса LoggerInterface и разместить в папке app/Optional/MainLogger.php (класс App\Optional\MainLogger).
Задать максимальный принимаемый логгером уровень можно при помощи константы HLEB_MAX_LOG_LEVEL в конфигурации фреймворка, например, define('HLEB_MAX_LOG_LEVEL', 'info'). Не рекомендуется устанавливать это значение ниже "warning", иначе могут быть не учтены в логах ошибки выполнения и компиляции PHP кода.
Контроллеры: перенос общих данных
Реализована передача данных из контроллера в контроллер (для этого он должен быть унаследован от класса MainController или MainMiddleware). Для манипуляции данными в контроллерах и посредниках используются методы:$this->getControllerData(<attribute>) - получение общих данных для контроллеров по ключу или целиком массив без указания ключа.
$this->setControllerData(<attribute>, <value>) - сохранение данных по ключу.
$this->clearControllerData( ) - удаляет все общие данные.
$this->getControllerDataKeys( ) - возвращает список существующих ключей.
В контроллере-посреднике устанавливается значение: