Главный сервис-класс

Это центральный элемент компонента 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>
    
    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.