Привет, Хабр! Меня зовут Алексей, и я разрабатываю BloggyCMS — систему управления контентом, которая выросла из маленького пет-проекта во что-то гораздо более серьёзное.

Дашборд BloggyCms
Дашборд BloggyCms

Это первый пост, и я хочу рассказать не столько о фичах (хотя их много), сколько о пути: как желание сделать «просто блог на PHP» привело к архитектуре, которой я теперь горжусь.

С чего всё началось

Два года назад мне понадобился блог. WordPress? Слишком жирно. OctoberCMS? Интересно, но хотелось своего. Я сел и написал за пару вечеров простейший движок:

  • index.php — список постов.

  • post.php — один пост.

  • admin.php — форма с textarea для текста

Это работало. Но мне стало скучно.

Точка невозврата: «А давайте добавим блоки»

Первым серьёзным архитектурным вызовом стала идея сделать контент постов составным. Не просто текст с HTML-тегами, а перетаскиваемые блоки: заголовок, текст, изображение, галерея, цитата.

Я начал проектировать систему PostBlocks. И вот тут пришлось резко взрослеть:

  • Потребовался роутер с поддержкой динамических параметров.

  • Нужна была система событий, чтобы плагины могли влиять на рендеринг блоков.

  • Появилась необходимость в API для AJAX-запросов из админки.

Маленький блог превращался в конструктор страниц.

Процесс создания поста в админке
Процесс создания поста в админке

Что получилось в итоге

Сейчас BloggyCMS — это не просто бложик, а полноценная CMS с открытым кодом. Вот что под капотом:

Архитектура на уровне фреймворков

Я не стал изобретать велосипед, а взял лучшие практики:

  • MVC с тонкими контроллерами и паттерном Action (один класс — одно действие).

  • DI — база данных пробрасывается через конструкторы, никаких global $db

  • Хуки и фильтры в стиле WordPress: Event::trigger() и Event::filter()

  • API-first подход: любую модель можно дёрнуть через единый хелпер API::Post_getById()

Безопасность с первого дня

  • PDO + Prepared Statements везде. SQL-инъекции исключены.

  • XSS-защита: хелпер html() используется систематически в шаблонах.

  • RBAC: права на основе групп пользователей, гибкая настройка видимости контента.

Page Builder внутри

Блоки контента — это отдельные PHP-классы, наследующие BasePostBlock. Каждый блок умеет:

  • Рендерить свою форму настроек в админке.

  • Обрабатывать и валидировать данные перед сохранением.

  • Выводить себя на фронтенде с учётом пресетов (сохранённых шаблонов).

  • Давать SEO-рекомендации (например, «H1 слишком короткий»).

В админке это выглядит как современный визуальный редактор с превью блоков, фильтрацией по категориям и поддержкой drag-and-drop.

Кастомные поля без плагинов

В WordPress для этого нужен ACF. В BloggyCMS — встроенная система полей с поддержкой типов:

  • Строка, текст, число, дата, цвет.

  • Выпадающие списки, чекбоксы, повторители (repeater).

  • Изображения, иконки.

Поля автоматически появляются на странице создания поста и могут выводиться через шорткоды.

Почему я решил открыть код

Я долго сомневался. Это же мой код, мой стиль, мои решения. Но в какой-то момент понял:

  • Обратная связь от сообщества бесценна. Уже нашлись баги, которые я сам не видел.

  • Портфолио. Такой проект говорит о разработчике больше, чем строчка в резюме.

  • Помощь другим. Я сам учился на открытых проектах. Пора отдавать долг.

Что дальше?

Сейчас CMS стабильна, но до версии 1.0 есть что дорабатывать:

  • Кеширование мета-данных (события, карта моделей).

  • Унификация систем полей (остался технический долг с ранних версий).

  • Документация для разработчиков плагинов и тем.

Буду рад звёздочкам на GitHub, issues и пулл-реквестам. Проект открыт и живёт по адресу:
👉 github.com/pechoradev/BloggyCms

В следующих постах расскажу подробнее про архитектуру блоков, систему событий и API. Если интересно — подписывайтесь!