LydiaCMS

Dashboard administrácie LydiaCMS

LydiaCMS je modulárny viacjazyčný PHP CMS, ktorý od roku 2018 vyvíjam sám. Je to moje pieskovisko: skutočný kód, na ktorom si skúšam nové technológie a postupy, napríklad Nette, Doctrine ORM, statickú analýzu, Rector, E2E testy (Playwright) alebo MCP server pre AI asistentov.

Prehľad stránok v administrácii LydiaCMS
Prehľad stránok: filtre a radenie, rodič stránky, aktivita celkovo aj po jazykoch a hromadné akcie. Grid vzniká z metadát entity, nie ručným písaním.

V číslach

  • 13 produkčných balíčkov vrátane jadra
  • 6 jazykov priamo v dátovom modeli
  • 600+ testov jadra a end-to-end sada v Playwrighte
  • 8 + 14 vlastných pravidiel PHPStanu (na maxime) a Rectora

Čo CMS vie

Základné funkcie, ktoré sa pri tvorbe webu hodia. Každá je v jadre alebo v samostatnom balíčku a zapína sa podľa potreby.

  • Viacjazyčnosť. Šesť jazykov (CS, DE, EN, ES, FR, SK) v administrácii aj na webe. Slovníky textov a články blogu sa dajú prekladať automaticky cez DeepL alebo Google Translate a výsledky sa cachujú.
  • Prívetivé lokalizované adresy. URL zodpovedá stromu stránok a je samostatná pre každý jazyk. Keď sa zmení slug, stará adresa sa trvalo presmeruje.
  • SEO. Titulok, popis, názov v omrvinkovej navigácii a zákaz indexovania pre každú stránku a jazyk, náhľad titulku v administrácii, kanonická adresa a štruktúrované dáta omrvinkovej navigácie.
  • Roly a oprávnenia. Pravidlá sa nastavujú pre každý kontext (systém, frontend, administrácia, API, balíček, submodul, záznam) a dedia sa po strome.
  • Modularita. Každý modul (blog, menu, formuláre, lokality…) je samostatný Composer balíček, ktorý sa zapojí jedným rozšírením a pridá vlastné entity, routy a migrácie.
  • Optimalizácia assetov. Obrázky sa vydávajú vo formáte WebP so srcset a lenivým načítaním, CSS a JavaScript sa zlučujú a minifikujú.
  • Formuláre. Builder formulárov v administrácii s vlastnými poľami a prehľadom odpovedí.
  • AJAX v administrácii. Prehľady, filtre a akcie sa prekresľujú po častiach (snippety), bez načítania celej stránky.
  • A ďalšie. Auditný log s vracaním zmien, kôš, cookie consent (Consent Mode v2), REST API a MCP server, atribúty na entitách a zálohy.

Čo som postavil

MCP server pre AI asistenta s oprávneniami a auditným logom

Chcel som, aby mi AI asistent upravoval obsah webu, ale nechcel som mu dať prístup do databázy ani administrátorský účet. Postavil som MCP server, ktorý beží pod konkrétnym používateľom, potrebuje zdieľaný token a prechádza rovnakými kontrolami oprávnení (ACL) ako administrácia. Každá zmena sa zapíše do auditného logu so starou a novou hodnotou a administrácia ju ukáže ako rozdiel, takže presne vidím, čo asistent urobil, a zlú zmenu môžem vrátiť. Takto sa upravuje aj tento web.

AI a bezpečnosť · kód HTTP rozhrania: lydiacms-api

Okno so zmenami v auditnom logu LydiaCMS: rozdiel názvu stránky a tlačidlo „Vrátiť túto zmenu“
Auditný log: pri každej zmene je vidieť, kto ju vykonal, a rozdiel medzi starou a novou hodnotou, vrátane zmien od AI asistenta. Tlačidlo zmenu vráti.

SEO URL so stromovou štruktúrou a 301 presmerovaním

Stránky majú potomkov, a adresa preto zodpovedá štruktúre webu: /projekty/lydiacms/architektura. Google čitateľné adresy a logickú štruktúru odporúča, priamy vplyv na poradie vo vyhľadávaní však majú len malý.

Ku každej stránke a jazyku preto nastavujem SEO vlastnosti priamo v administrácii: slug, titulok, popis, názov v omrvinkovej navigácii alebo zákaz indexovania. Keď slug zmením, pôvodná adresa sa automaticky trvalo presmeruje (301) na novú, a rovnako aj keď stránku presuniem alebo premenujem niektorého jej predka. Kanonická adresa je vždy jedna a podľa dokumentácie Googlu trvalé presmerovanie stratu PageRanku nespôsobuje. Web navyše vypisuje štruktúrované dáta omrvinkovej navigácie.

Kvalita a vývoj

Oprávnenia (ACL) po strome kontextov

Pravidlá pre každý modul, submodul a záznam zvlášť by sa nedali udržať. Kontexty preto tvoria strom (systém, frontend, administrácia alebo API, balíček, submodul, záznam): predvolené pravidlo sa nastaví raz pre celú vetvu, pravidlo pri balíčku platí pre všetky jeho submoduly a nový modul nepotrebuje žiadne vlastné. Nikto nemôže prideliť viac práv, než má sám, a sady pravidiel pre typické roly sa nastavia jedným kliknutím. Rovnaké pravidlá platia pre administráciu aj pre AI asistenta.

Architektúra

Generovanie administrácie z metadát (metadata-driven CRUD scaffolding)

Pri viac ako sto entitách by ručné písanie formulárov a prehľadov zabralo viac času než samotná funkčnosť. Administrácia sa preto generuje z mapovania Doctrine ORM entít: gridy, filtre, formuláre aj validáciu dĺžky polí odvádzam z metadát a atribútov. Vlastnú šablónu píšem len tam, kde dáta nie sú ploché, napríklad pri strome menu alebo builderi formulárov, a drobnosť ako nápoveda je jeden atribút pri poli. Nová entita dostane funkčnú administráciu hneď.

Architektúra

Statická analýza PHP: PHPStan na najvyššej úrovni a vlastné pravidlá Rector

PHPStan beží na najvyššej úrovni (max) s 8 vlastnými pravidlami, ktoré strážia konvencie projektu, a 14 vlastných pravidiel Rector vie odchýlky opraviť hromadne naprieč všetkými balíčkami. Chyby v architektúre sa tak zachytia pri analýze, a nie až za behu. Kód: PHPStan, Rector.

Kvalita a vývoj

CI/CD v GitLabe a nasadenie bez výpadku (zero-downtime deployment)

Vydanie novej verzie nesmie rozbiť prevádzku. Každý balíček používa jednu zdieľanú GitLab CI pipeline, ktorá ho overí, na hlavnej vetve označí ďalšiu verziu a publikuje ju do súkromného Composer registra. Nasadenie je jeden skript: zostaví release, pred zmenou ho vyskúša, zazálohuje databázu, spustí migrácie, prepne prevádzku na nový release a pri neúspešnej kontrole sa sám vráti na predchádzajúcu verziu.

Kvalita a vývoj

Vyskúšajte si to

Verejná časť webu beží v deme na cms.krejciradek.cz. Administráciu z bezpečnostných dôvodov nezverejňujem, ale môžete si ju spustiť u seba: repozitár lydiacms-demo je aplikácia v Docker Compose, ktorú spustíte jedným príkazom (make start, vo Windows skriptom pre PowerShell). Skript postaví kontajnery, vytvorí databázu, naplní ju ukážkovým obsahom (stránky, blog, menu, formuláre, katalóg) a založí administrátora s náhodným heslom. Balíček core je zámerne súkromný, preto skript na začiatku vyžiada deploy kľúč na stiahnutie jadra. Na požiadanie vám ho zriadim. Kód ostatných balíčkov je na GitLabe.

Technológie: PHP 8.5 · Nette · Latte · Symfony (Console, EventDispatcher, Cache) · Doctrine ORM a DBAL · MySQL 8.4 · Flysystem · Docker · GitLab CI/CD · PHPStan · Rector · Nette Tester · Playwright

Napíšte mi cez kontaktný formulár