01
Задача
Идея проекта появилась из личного travel-блога на Joomla. Заметки уже хранились в базе CMS, но хотелось получить отдельный интерфейс, где все поездки можно увидеть на карте и при необходимости отфильтровать.
Основная задача — не дублировать данные в новой системе, а использовать существующую базу Joomla как источник данных, а Laravel API сделать связующим слоем между базой и Vue-интерфейсом.
02
Архитектура
Проект разделён на несколько уровней. Joomla продолжает отвечать за хранение материалов, Laravel предоставляет API, а Vue.js отвечает за интерфейс карты. Для визуализации используется MapLibre GL.
По мере развития проекта была проведена синхронизация таблиц. Данные Joomla стали перекачиваться в таблицу Laravel и тянуться оттуда напрямую. Новые данные добавляются в таблицу Laravel, существующие обновляются, а неактуальные удаляются.
Для оптимизации запросов было реализовано кеширование данных с помощью Redis.
Все эти службы с определенной периодичностью запускает Scheduler.
Поток данных: Joomla DB → Scheduler → Synchronization → Laravel DB (name_table)
Laravel API → Redis → Vue.js → MapLibre GL → маркеры и popup
MySQLLaravel APIRedisVueMapLibre
03
Получение данных
Scheduler обращается к таблице контента Joomla через отдельное подключение к базе -> берет данные -> добавляет/обновляет/удаляет в таблице Laravel
DB::connection('database_joomla')
->table('name_table_joomla')
->get();
Потом последующие данные уже берутся непосредственно из таблицы Laravel
return self::query()
->select(...)
Отдельный endpoint позволяет получать точки с фильтром по году, поэтому Vue не нужно загружать и обрабатывать весь набор данных при каждом переключении фильтра.
Данные кешируются с помощью Redis и поэтому нет необходимости постоянно тянуть данные из таблицы. Кеш обновляется также с помощью планировщика каждый час.
04
Карта и маркеры
На клиентской стороне MapLibre используется для отображения карты. Для каждой записи создаётся маркер, а popup показывает дополнительную информацию о путешествии.
Отдельно прорабатывалась стилизация маркеров и popup, чтобы интерфейс карты визуально выглядел симпатично и современно.
05
Фильтрация
Фильтр по годам отправляет запрос в Laravel API. Если год не выбран, загружается полный набор точек. При выборе года API возвращает только соответствующие записи.
/api/filter-data?year=2025
Такой подход позволяет оставить бизнес-логику фильтрации на сервере и не перегружать браузер лишними данными.
07
Результат
В результате получился отдельный картографический интерфейс, который использует реальные данные travel-блога и может развиваться независимо от Joomla. Архитектура также оставляет возможность добавлять новые фильтры, типы точек и дополнительные API-методы.