Главный сервис-класс
Это центральный элемент компонента ZoomX. Он отвечает за управление процессом обработки запроса и подготовки ответа. Т.е. он перехватывает управление у главного класса системы с помощью подмены стандарных классов MODX на свои собственные, используя встроенные возможности расширения. Объект сервиса можно получить двумя способами:
# Способ 1. $zoomx = Zoomx\Service::getInstance(); # Способ 2. $zoomx = zoomx();
Главный сервис хранит ссылки на важные объекты ядра системы в свойствах класса:
$modx
- главный объект системы MODX.$parser
- текущий парсер.$request
- объект обработки запроса.$response
- объект подготовки ответа.$elementService
- объект сервиса управления элементами MODX (чанками и сниппетами). Заменяет встроенный функционал MODX.
Получить их можно с помощью хелпера zoomx()
, передавая имя свойства в параметре:
$request = zoomx('request');
Парсер можно получить с помощью отдельной функции-хелпера parserx()
.
Также сервис имеет ограниченный функционал контейнера зависимостей - он может хранить пользовательские объекты.
# Сохранить данные в контейнер zoomx()->set('foo', $object); // или так zoomx(['foo' => $object]); ... # Получить данные $object = zoomx('foo');
Основные методы:
autoloadResource()
— переключает системную настройкуzoomx_autoload_resource
для текущего запроса. В параметре необходимо передатьtrue
илиfalse
. Используется для виртуальных страниц или отдачи файлов, когда не нужно подгружать текущий ресурс.
$router->get('api/users/{id}', function($id) use($modx) { // Отключаем автозагрузку ресурса по указанному URI zoomx()->autoloadResource(false); // Вывести виртуальную страницу return viewx('profile.tpl', $user->toArray()); });
config()
— выводит указанную системную настройку MODX, если передан строковый ключ. Если передан массив в формате ['key' => 'value']
, то в массив системных настроек будет добавлена системная настройка с указанным ключом и указанным значением. Аргументы:
$key
- ключ системной настройки (чтобы получить значение) или ассоциативный массив (чтобы сохранить значение).$default
- значение по-умолчанию.
isAjax()
— проверяет наличие заголовка HTTP_X_REQUESTED_WITH
.$router->get('users/{id}', function ($id) use ($modx) { $user = $modx->getObject('modUser', ['id' => (int)$id]); // Если запрос Ajax, то вернуть json if (zoomx()->isAjax()) { return jsonx($user->toArray()); } // Инача вернуть ошибку abortx(400, 'Некорректный способ запроса.'); });
getResource()
— используется для получения ресурса. Если ресурс закэширован, то запроса в базу данных не будет. Удобно использовать в роутах для получения ресурса по URI.Аргумент:
$identifier
- идентификатор ресурса. Можно указать или id или URI.
$router->get('users/{id}', function($id) use($modx) { $user = $modx->getObject('modUser', ['id' => (int)$id]); // Так как URI у страницы профиля пользователя "profile", а URI этого роута "users/{id}", // MODX не найдёт эту страницу. Поэтому нужно получить её самостоятельно. $modx->resource = zoomx()->getResource('profile'); return viewx('profile.tpl', $user->toArray()); });
Если загрузить ресурс в роуте, то дальше MODX не будет искать ресурс для указанного URI.
getChunk()
— вызывает чанк по аналогии со стандартным modX::getChunk()
. Этот метод всего лишь алиас метода Zoomx\ElementService::getChunk()
. Аргументы:
$name
- название чанка. Можно указывать байндинги@INLINE
и@FILE
. Файловые чанки указываются относительно пути, указанного в системных настройкахzoomx_template_dir
иzoomx_theme
.$properties
- массив параметров.
$content = zoomx()->getChunk('@FILE profile.tpl', $user->toArray()); // Под капотом работает так $content = zoomx()->getElementService()->getChunk('@FILE profile.tpl', $user->toArray());
runSnippet()
— вызывает стандартный сниппет. По аналогии с предыдущим методом он также представляет собой алиас метода Zoomx\ElementService::runSnippet()
. Аргументы:
$name
- название сниппета.$properties
- массив параметров.$cacheOptions
- количество секунд для кэширования.
$result = zoomx()->runSnippet('usual_snippet', $properties);
runFileSnippet()
— вызывает файловый сниппет. Является алиасом одноимённого метода класса Zoomx\ElementService
. $name
- название файла. Указывается путь к файлу, относительно пути, указанного в системной настройкеzoomx_snippet_path
.$properties
- массив параметров.$cacheOptions
- количество секунд для кэширования.
Аргументы:
$result = zoomx()->runFileSnippet('file_snippet.php', $properties);
Расширение .php
можно не указывать.
shouldBeJson()
— проверяет заголовки HTTP_ACCEPT
и Content-Type
. Возвращает true
, если хоть один из них содержит значение "application/json". Используется при инициализации главного сервиса для подгрузки соответствующих классов. Расширение класса
В данный класс можно добавлять свои методы. Делается это с помощью макросов как в Laravel. Для этого необходимо в плагине на событие OnZoomxInit
добавить название метода и функцию, содержащую код метода. Ниже пример создания метода message()
объекта главного сервиса.
// Плагин // Событие OnZoomxInit Zoomx\Service::macro('message', function () { return 'Это сообщение из добавленного метода.'; });
Соответственно, теперь можно вызывать созданный метод главного сервиса.
return zoomx()->message();
А так как объект $zoomx
доступен в шаблонах Smarty, то этот метод можно использовать и там.
<div class="alert">{$zoomx->message()}>/div>