Зібрати найкраще з двох світів - фреймворків та CMS

Чотири роки — це в IT вже довгобуд. Саме стільки, і навіть трохи більше часу мені знадобилося, щоб довести CleverStyle CMS до версії 1.0, до стану коли архітектура налагодилось, є достатня функціональність і цілісність системи як такої, всі знайдені баги виправлені, і основні сценарії працюють без проблем.
Вийшло створити щось середнє між фрейворком і, власне, CMS, як раз те, що потрібно для розробника, і хочу поділитися з співтовариством.
Впевнений, багатьом не вистачало саме такого рішення, це підтверджується численними питаннями на тому ж Тостері і довгими гілками коментарів під ними.

Обов'язково потрібно пояснити чому

Складність, надмірність, гнучкість, функціональність і швидкість.



Я не знайшов рішення, яке мало б задовільний для мене баланс цих параметрів (безпека теж, але це очевидно і само собою розуміється спочатку).
CleverStyle CMS — це не CMS в звичному сенсі, це CMF, вище фреймворку за рівнем архітектури але нижче і гнучкіше CMS.
У зв'язку з таким позиціонуванням вийшло дуже зручне рішення в першу чергу для розробки унікального функціоналу, так як є більшість необхідних інструментів, за якими не потрібно далеко йти не потрібно налаштовувати, а можна відразу використовувати і отримувати результат.

Відмінності в порівнянні з фреймворком:
Прихований текстЄ відмінна стаття в тему, яка трохи проливає світло на моє до них ставлення Чому я ненавиджу фреймворки
  • істотно менше шарів абстракції
  • як наслідок простіше і прозоріше структура
  • як наслідок більш висока швидкість роботи і менше споживання пам'яті (ядро відпрацьовує за 2-4 мс і їсть близько 1 Міб пам'яті в піке, решта залежить від розробника кінцевого функціоналу)
  • не передбачає складання з різноманітних компонентів — все вже зібрано і адекватно налаштоване
  • немає централізованого конфига маршрутів, кожен компонент зберігає все в собі
  • простота — завдяки більш низьким рівнем абстрактності коду поріг входу значно нижче
  • всі частини ядра підігнані, при необхідності пропатчены, і гарантовано працюють разом, це не просто набір довільних бібліотек, а єдине функціональне ціле
У порівнянні з CMS:

  • з коробки ніякої специфічної функціональності, тільки ядро і більше нічого
  • як наслідок додається тільки необхідна функціональність
  • як наслідок більш висока швидкість роботи і менше споживання пам'яті
  • так само вище гнучкість — настроюється і хакается буквально все
  • практично не існує вигляду сайту, який можна зробити за архітектурних обмежень
  • підтримка речей більш характерних для фреймворків, наприклад підхоплюється composer, є Restful API

Складність, надмірність


Мені завжди не подобалися файли виду:

<?php
namespace Acme\DemoBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AcmeDemoBundle extends Bundle
{
}

Це трохи менше ніж повністю непотрібний файл не несе ніякої корисної навантаження, це шаблон, а шаблони повинні матися на увазі за замовчуванням, якщо не міняти шаблон — його не потрібно створювати.
Тому в CleverStyle CMS подібні шаблонні штуки не потрібні, ви пишете код тільки тоді, коли він робить хоч щось корисне.

Як приклад — вам практично ніколи не потрібно прописувати вручну підключення CSS/JS/HTML файлів на сторінках — можна в простому JSON вказати на яких сторінках вони потрібні — система робить це автоматично, а можна не вказувати — тоді файли будуть підключені на всіх сторінках сайта (що іноді теж цілком собі варіант).

Хочете
Hello, world!
— прямо так і пишете в index.html, кладіть його в папку модуля, включаєте модуль в адмінці, він готовий до роботи. Не треба купи вкладених папок, шаблонних контролерів та іншого — просто файл з контентом.

Немає нескінченних конфіги — є один маленький базовий з налаштуванням доступу до БД, сховища, кешу, зазначений базовий часовий пояс, базовий мову сайту, і ключі, які використовуються для солі пароля і для шифрування — критично важливі параметри, які потрібні для запуску ядра.
Параметри прописуються на етапі установки, більшість генерується/визначається автоматично.
Всі інші можливі параметри налаштовується в графічному інтерфейсі і зберігаються в БД.

Налаштування компонентів теж зберігаються в БД, і очищаються при видаленні компонента, для управлінням конфігурацією компонента є гранично простий внутрішній API — параметри задаються як властивості об'єкта.

Маршрути теж працюють максимально просто, в загальному вигляді виглядає так: api|admin/Module_name/level_1/level_2, при цьому всі крім Module_name необов'язково і використовується тільки коли треба.
На кожному рівні маршруту є відповідальний файл, який відпрацьовує свій рівень, але якщо обробка потрібна тільки на наступному рівні — на поточному обаботку можна пропустити.
Самі рівні описуються одно — або двовимірним масивом у форматі JSON:

{
"level_1" : [
"sublevel_1",
"sublevel_2"
]
}

При відкритті сторінки admin/Module_name/level_1/sublevel_1 відпрацюють такі файли за наявності:

  • admin/index.php
  • admin/level_1.php
  • admin/level_1/sublevel_1.php
Так само з міркувань простоти і зручності вибиралися і сторонні компоненти, наприклад:

  • PHPMailer — єдиний файл, в якому є все для відправки пошти, для підтримки SMTP потрібен ще один файл
  • PHPT тести — запускаються з одного файлу, писати і читати тести просто (не дарма їх використовують у розробці самого PHP, і, наприклад, в модифікованому вигляді в HHVM), на відміну від монстра PHPUnit

Функціональність, швидкість



З коробки система розуміє що буває кілька БД, вони можуть бути різними, у них бувають дзеркала, вміє випадковим чином балансувати запити між дзеркалами (можна відправляти запити на запис на майстер, а читання на дзеркала). Аналогічно підтримується кілька сховищ для статики.

Підтримується багатомовність інтерфейсу і вмісту, ядро (і базові компоненти нижче) з коробки використовує це скрізь, де це можливо.

Користувачі групи користувачів, дозволи, які можна призначати як групами, так і окремим користувачам, підтримуються зв'язки між користувачами (проста система контактів).

Є інтерфейс відправки пошти, у тому числі з вкладеннями та іншими необхідними можливостями.

Повсюдне кешування — в переважній більшості запитів ядро навіть не з'єднується з БД, так як кешується все, що має сенс кешувати.

На фронтенде підключені jQuery, UIkit, Polymer (+ WebComponents.js), вони налаштовані працювати разом (це не завжди тривіально, враховуючи веб-компоненти).
Веб-компоненти використовуються нарівні із звичайним CSS/JS кодом, система розуміє HTML імпорти, Paper Elements і будь-які сторонні готові компоненти з легкістю.

Залежності між компонентами (обов'язкові і не дуже) автоматично впливають на порядок включення CSS/JS/HTML файлів на сторінці, так що у вас завжди буде передбачуваний і правильний порядок ініціалізації файлів.

CSS/JS/HTML файли минифицируются, об'єднуються, тиснуться з допомогою gzip в окремі файли, які підключаються всі так само з урахуванням залежностей, система робить все сама, в тому числі виставляє заголовки для правильного кешування файлів браузером і/або CDN.

Всі створювані файли і записи в БД контролюються, таким чином продуктивність є контрольованою і прогнозованою. Це дає комфортне відчуття контролю за станом сайту.

Також генеруються правильні мета-теги щоб пояснити пошуковим системам на яких мовах за якою адресою ще доступна ця сторінка (в багатомовною конфігурації), генеруються Open Graph мета-теги.

Компоненти збираються в дистрибутиви або через графічний інтерфейс, або з командного рядка, встановлюються/оновлюються з адмінки в графічному інтерфейсі (ядро теж можна ставити з командного рядка).

насправді є не тільки ядро



Насправді так, для прикладу, і для зручності створено кілька компонентів, які несуть корисну функціональність самі по собі, або, що ще більш важливо, легко інтегруються в інші компоненти.
Прямо зараз готові:

  • Blogs — блог (одне і багатокористувацький), організація частково почерпнута з хабрахабра
  • Comments — коментарі, інтегрується в інші компоненти
  • Disqus — аналогічно Comments, але з використанням однойменного сервісу, інтегрується так само як Comments, можна на вибір брати або один, або інший
  • Cron — простий менеджер crontab (обгортка над консольними командами)
  • Deferred tasks — дозволяє відкласти виконання завдання, прискорюючи відповідь сервера, виконуючи завдання у тлі
  • Feedback — проста зворотній зв'язок
  • Photo gallery — фотогалерея
  • fotorama.js — jQuery плагін слайд-шоу для фото і не тільки, інтегрується з іншими компонентами
  • Plupload — HTML5 завантажувач файлів, інтегрується в інші компоненти, працює як з кліком, так і з перетягуванням файлів на об'єкт (Drag & Drop)
  • TinyMCE — візуальний HTML-редактор, інтегрується в інші компоненти
  • OAuth2 — сервер OAuth2, дозволяє, наприклад, підключати до сайту мобільні додатки
  • HybridAuth — вхід на сайт через безліч різноманітних соціальних мереж і інших сервісів
  • Content — створення простих елементів контенту з можливістю редагувати на місці, інтегрується з іншими компонентами, може використовуватися сам по собі
  • Static pages — можливість створювати прості статичні сторінки
Крім стандартної теми оформлення, яка використовується в основному тільки для адмінки є ще два, також сторонні портувати простіше простого, адже тема оформлення — простий HTML файл, в який підставляється контент і деякі інші дані (є два приклад портування в GitHub з покроковими коммитами від вихідного шаблону, до стану, коли він є темою оформлення CleverStyle CMS).

Різне





Ядро CleverStyle CMS всього 2 Міб і складається приблизно з 280 файлів (це вже включаючи всі сторонні бібліотеки), має все необхідне для розробки переважної більшості всіляких сайтів розміром від візиток до масштабованих на кілька серверів.

Всі інструменти готові до використання прямо після установки (що складається з одного кроку), і не потребують обов'язкової налаштуванні, але піддаються перенастроюванні при потребі.

Архітектура спроектована з нуля, дещо змінювалася з часом, враховуючи досвід практичного використання в продакшені, і встановилась в такому вигляді, якому є зараз.
В ядрі використовуються як готові сторонні бібліотеки, так і спеціально написані, деякі були написані спеціально для CleverStyle CMS і потім відокремилися в самостійні проекти.

Код доступний на GitHub під ліцензією MIT: https://github.com/nazar-pc/CleverStyle-CMS

Незважаючи на те, що система повинна розглядатися скоріше як моноліт — багато частині або відразу, або з невеликим зусиллям можна відірвати і використовувати окремо — наприклад, минификация і об'єднання CSS/HTMLфайлов, реалізація псевдо-файлової системи в кеші (по суті підтримка тегів) для APC і Memcached, та й ще багато чого, код під ліцензією MIT, можна використовувати.

Є wiki з описом пристрою і взаємодії різних частин системи: https://github.com/nazar-pc/CleverStyle-CMS/wiki

На базі движка працює кілька сайтів, є мобільні додатки, так що функціонал живий і робочий, використовується в бойових умовах.

Як спробувати



Демка з публічно доступним сайтом погано підтримується — пароль хтось змінить, то налаштує щось, та й зламати з повним адмінських доступом при бажанні не важко.
Завдяки тому, що останні версії підтримують збірку і установку в режимі командного рядка стало можливим приготувати образ для Docker з автоматично оновлюється і завжди останньої git версією системи.
Запускається так:

docker run --rm-p 8888:8888 nazarpc/cleverstyle-cms

Після цього можна відкривати
http://localhost:8888
і дивитися (логін admin, пароль 1111), всі компоненти спочатку відключені, але доступні в адмінці.
--rm видалить контейнер після зупинки (можна зупинити за допомогою Ctrl+C).

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.