Skip to content

Petrovo CMS - Deterministic Microframework

Petrovo CMS je minimalistický PHP framework pro interní projektové řešení. Zaměřuje se na determinismus, transparentnost a čitelnost kódu namísto abstrakčních vrstev a konvencí.

Základní Principy

  • Determinismus > Abstrakce - Když čteš kód, přesně víš, co se stane. Žádná skrytá logika.
  • Transparentnost > Konvence - Přímý SQL, explicitní routy, viditelný middleware.
  • Čitelnost > Chytrost - Malý tým (3-5 vývojářů) který zná celý codebase.
  • MariaDB-first - Přímé SQL dotazy přes prepared statements. Bez ORM.
  • Minimální konfigurace - YAML soubory, žádné DI kontejnery, žádné framework overhead.

Požadavky

PHP 8.4+, MariaDB 10+

Rychlý Start

Spuštění

./server                    # Vývojový server
./console list              # Dostupné CLI příkazy
./pest                      # Spuštění testů

Vytváření Komponent

./console make:cubetype     # Nový cube (blok obsahu)
./console make:tag          # Nový template tag
./console make:module       # Nový admin modul

Běžné Operace

./console db:create:page    # Vytvoří novou stránku
./console db:create:user    # Vytvoří admin uživatele
./console cron:purge-cache  # Vymaže cache
./console auth:invite       # Pošle passkey invite do administrace

Architektura v Kostce

Request Flow

HTTP Request
    ↓
public/index.php → app/bootstrap.php
    ↓
Named Middleware Pipeline (website|admin|adminTools|run|run-admin)
    ↓
Router
    ↓
Handler (Controller, Tag, Route file)
    ↓
Template Engine → Response (PSR-7)

Klíčové Komponenty

Komponenta Umístění Účel
Database core/Database/ Přímý SQL přes PDO, parameterized queries
Template Engine core/Template/ Custom tag-based šablony + RainTPL
Cube System core/Cube/ Reusable dynamické obsahové bloky (komponenty)
Modules app/Modules/ Aplikační logika, controllery a služby
Middleware app/Middlewares/ PSR-15 pipelines pro routing
Routes app/routes/ Vlastní Core\Route registry-based routing

Struktura Projektu

app/
├── bootstrap.php          # Inicializace, routes, middleware
├── Modules/               # Hlavní aplikační moduly
├── Middlewares/           # Middleware komponenty
├── Cubes/                 # Cube komponenty
├── website/               # Website tagy, šablony a route handlery
├── admin/                 # Sdílené admin šablony a legacy tools
├── routes/                # Route definice
└── commands/              # CLI příkazy

core/
├── Database/              # DB layer (PDO wrapper)
├── Template/              # Template engine
├── Cube/                  # Cube system
├── Data/                  # Data API
├── Menu/                  # Menu system
├── Cache/                 # Caching layer
└── ...                    # Ostatní komponenty

public/
├── index.php              # Hlavní entry point
└── ADMIN/                 # Statické assety administrace

var/                       # Runtime cache a tmp soubory
tests/                     # Pest testy

Dokumentace

Aplikace (App Layer)

Logika CMS, routing, middleware, templating, CRM funkce.

Core Framework

Základní infrastruktura a utility.

Běžné Vzory

Database Query

use DB;

// Parameterized queries vždy
$user = DB::row("SELECT * FROM users WHERE id = ? AND active = ?", [$userId, 1]);
$users = DB::results("SELECT * FROM users WHERE status = ?", ['active']);
$count = DB::var("SELECT COUNT(*) FROM users");

Template Tag

// app/tags/myTag.php
return function(array $params, object $BOX, array $calls): array {
    $output = '<div>' . ($params['text'] ?? '') . '</div>';
    return [$output, $BOX];
};

// V šabloně: {T myTag text="Hello"}

Route Handler

// app/routes/website.php
get('/newsletter-email-activation', __DIR__ . '/../website/tags/newsletter/add-email/activation.php', PIPE_WEBSITE);

Cube Komponenta

Cube systém je dvouúrovňový - Cube Types (šablony) + Cube Instances (vyplněná data):

Cube Type (Blueprint - vytvořte jednou, používejte všude):

app/Cubes/mycube/
├── data.yaml         # ⭐ Klíč: Deklarativní definice formulářových polí
├── template.tpl      # Frontend šablona
├── frontend.php      # Volitelná logika zpracování dat
├── controller.php    # Volitelná příprava selectů pro admin
├── _data.json        # Metadata typu
└── images/           # Náhled v administraci

Cube Instance (Konkrétní obsah - mnoho instancí z jednoho typu):

  • Redaktor v adminu vybere typ a vyplní formulář
  • Automaticky se vygeneruje z data.yaml
  • Data se uloží do DB a vloží do stránky

Vytvoření typu:

./console make:cubetype

Workflow: Type (struktura) → Admin Form (automaticky z YAML) → Instance (data) → Frontend Rendering

Filosofie: Proč tenhle přístup?

Malé týmy pracující na interních projektech nemusí enterprise framework. Potřebují:

  • Jasnost - Čteš kód a víš přesně co se stane
  • Rychlost - Bez abstrakčních vrstev je kód jednodušší
  • Kontrola - Nic není skryto, všechno je viditelné
  • Flexibilita - Funkční přístup, ne OOP dogmatismus

Tyhle principy dělají Petrovo CMS ideální pro interní korporátní řešení, kde všichni vývojáři znají codebase.


Podrobnější dokumentaci najdeš v sekci App a Core.