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é skrytou logiku.
  • 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.

Rychlý Start

Spuštění

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

Vytváření Komponent

./console make:cubetype     # Nový cube (blok obsahu)
./console make:endpoint     # Nový data endpoint
./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 cache:purge       # Vymaže cache

Architektura v Kostce

Request Flow

HTTP Request
    ↓
public/index.php → app/bootstrap.php
    ↓
Named Middleware Pipeline (frontend|admin|adminTools|data)
    ↓
Router (Siler routing)
    ↓
Handler (Controller, Tag, Data Endpoint)
    ↓
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 obsah bloky (komponenty)
Data Layer core/Data/ Internal JSON API
Middleware app/Middlewares/ PSR-15 pipelines pro routing
Routes app/routes/ Siler routing pro GET/POST/ANY

Struktura Projektu

app/
├── bootstrap.php          # Inicializace, routes, middleware
├── Controllers/           # Frontend a admin controllery
├── DATA/                  # JSON API endpointy
├── Middlewares/           # Middleware komponenty
├── cubes/                 # Cube komponenty
├── tags/                  # Template tagy
├── templates/             # Frontend šablony (.tpl)
├── 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              # Frontend entry point
└── ADMIN/index.php        # Admin panel entry point

var/                       # Runtime cache a tmp soubory
tests/                     # PHPUnit 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"}

Data Endpoint

// app/DATA/Products/list.php
use Petrovo\Data;
use DB;

$products = DB::results("SELECT * FROM products LIMIT ?", [50]);
return Data\outputJson(['status' => 'success', 'data' => $products]);

// GET /getData/Products/list

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.