[ZoomX]. Кэширование роутов

Вышла новая минорная версия 3.3.0-pl. Ещё одна за неделю. Вроде бы незначительное событие. Но тут есть о чём написать в отдельной статье. Итак, что в ней нового?

  1. Добавлен механизм кэширования маршрутов.
  2. Для файловых сниппетов можно указывать несколько путей.
  3. Исправлен баг с отображением неопубликованных ресурсов для пользователей, у которых на это нет прав.

Первый пункт сообщает нам, что теперь можно кэшировать роуты. Это очень положительно сказывается на производительности при большом количестве роутов. Благодаря этой фиче FastRoute до сих пор не могут обогнать более современные роутеры. Но есть очень важная вещь, которую требуется знать — маршруты можно кэшировать только если в качестве обработчиков используются контроллеры. Причина — анонимные функции не могут быть сериализованы. Т.е. их нельзя сохранить в кэше. Поэтому, если вы их используете в роутах, то получите 500-ю ошибку.

Включается этот режим с помощью системной настройки «zoomx_route_cache». По-умолчанию он естественно выключен.

// Такие роуты с функцией недопустимы для кэширования
$router->get('posts/{alias}', function($alias) {
    ...
});
// Правильный роут
$router->get('posts/{alias}', [PostController::class, 'show']);
Это самая важная причина, из-за которой я пишу данный пост.

Рассмотрим второй пункт. Теперь для файловых сниппетов можно указать несколько путей. Это позволяет хранить файлы в разных местах. Что позволит сторонним дополнениям указывать своё хранилище сниппетов. Плюс, если сниппеты каталогизированны по подпапкам, это позволит делать вызов простым, без указания подпапок в названии. Для этого в системной настройке «zoomx_file_snippets_path» нужно перечислить пути через ";".

// Системная настройка "zoomx_file_snippets_path" = "{core_path}elements/snippets/;{core_path}elements/snippets/folder/"
// Вместо относительного пути, если указан только один путь
{run file='folder/snippet' params=['foo' => 'bar']}
// Можно добавить второй путь и указать просто название файла сниппета 
{run file='snippet' params=['foo' => 'bar']}

Ну и последний пункт из changelog'а послужил ускорителем выпуска новой версии. Баг неприятный. Он спрятался в моём куске, оптимизировавшем загрузку ресурса, если отключена карта алиасов. Дело в том, что MODX в этом случае делает 2 запроса в БД — первый, чтобы получить id по URI, а второй по полученному id получает объект ресурса. В общем, 2 раза запращивается один и тот же ресурс. Я это дело оптимизировал, но слегка упустил момент с неопубликованными ресурсами. Спасибо комраду Семёну за находку.

В следующей версии планирую добавить файловые плагины. А пока вовсю работаю над документацией.
Сергей Шлоков
12 ноября 2021, 20:37
modx.pro
1
891
+16
Поблагодарить автора Отправить деньги

Комментарии: 5

Андрей Степаненко
16 ноября 2021, 18:41
0
Нельзя зашить ресурс по умолчанию?
Уж больше накладно для каждого маршрута новый ресурс создавать
    Николай Савин
    16 ноября 2021, 19:00
    +3
    Это не обязательно.
    Если написать в начале контроллера вот так
    zoomx()->autoloadResource(false);

    то загрузка ресурса не потребуется.
    Плюс если отправлять API запрос с заголовками (любым из них)
    'Accept': 'application/json',
        'Content-Type': 'application/json'
    то в этом случае также создание ресурса не потребуется.
      Сергей Шлоков
      17 ноября 2021, 08:12
      +3
      Кстати, если для основной части запросов ресурсы не нужны, то автозагрузку ресурсов можно отключить в соответствующей системной настройке. А для тех роутов, где ресурс нужен, подгружать его самостоятельно
      $modx->resource = zoomx()->getResource($alias_or_id);
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      5