• Блог
  • ZoomX. Кэширование роутов

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

  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 раза запращивается один и тот же ресурс. Я это дело оптимизировал, но слегка упустил момент с неопубликованными ресурсами. Спасибо комраду Семёну за находку.

В следующей версии планирую добавить файловые плагины. А пока вовсю работаю над документацией.

0   166

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.