В блог
20 мая 2026 Sogerien pagephpпаттерншаблонизатор

Страница за 10 строк

Вот целая страница блога на Universal Engine - выборка из базы, заголовок, тело, футер. Читается сверху вниз, как обычный скрипт, потому что это и есть обычный скрипт:

<?php
declare(strict_types=1);

Sogerien::Page()->set_templates([TemplateBlog::class]);

function h(mixed $v): string {
    return htmlspecialchars((string)$v, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}

$json  = Sogerien::DbController()->sql_request('main', [
    'sql'    => "SELECT title, data FROM sogerien
                 WHERE entity = 'post' ORDER BY created_at DESC LIMIT 20",
    'params' => [],
]);
$posts = json_decode($json, true);

Sogerien::Page()->title = 'Инженерный блог';
Sogerien::Page()->header();
Sogerien::Page()->mainmenu();
?>
<main class="container">
    <h1>Инженерный блог</h1>
    <?php foreach ($posts as $post): ?>
        <article class="post-card">
            <h2><?= h($post['title']) ?></h2>
            <p><?= h($post['data']['excerpt']) ?></p>
        </article>
    <?php endforeach; ?>
</main>
<?php Sogerien::Page()->footer();

Разбор по строкам

  • declare(strict_types=1) - первым же оператором. Строгие типы обязательны по всему ядру.
  • set_templates([TemplateBlog::class]) - выбираем скин. Лёгкий холст для контента, а не тяжёлая админка.
  • function h() - локальный экранизатор. Любой вывод в разметку проходит через него, без исключений.
  • DbController()->sql_request() - данные строкой JSON, тут же json_decode. Это одноразовый код, поэтому он живёт прямо в странице, а не в классе.
  • header() - здесь Template генерит <!DOCTYPE>, весь <head>, подключает шрифты ядра и ассеты скина.
  • mainmenu() - меню рисует скин, страница про него ничего не знает.
  • footer() - закрывает <body> и документ.

Почему это десять строк, а не сто

Всю оболочку - doctype, мета, шрифты Archivo / Figtree / IBM Plex Mono, порядок подключения скриптов, шелл <body> - несут Template и скин. Между header() и footer() страница пишет только своё тело. Ничего лишнего в неё физически не поместить.

Что сюда не пишут

В теле страницы нет ни одного <script src> и ни одного <link rel=stylesheet> на стороннюю библиотеку. Ассеты подключаются через скин, через класс Affects или через Page()->add_head_js() - но это отдельный разговор, ему посвящён следующий пост.

И ещё: файл сохраняется в UTF-8 без BOM. BOM перед <?php ломает strict_types - PHP ругается, что declare должен быть самым первым оператором. Первые байты файла обязаны быть 3C 3F 70 68 70.