# Архитектура Celena CMS

## Точки входа

- `index.php` — фронт сайта.
- `admin.php` — админ-панель (тонкий лоадер, передающий управление в `Kernel`).
- `install.php` — самоудаляющийся визард установки.
- `bin/celena` — CLI (миграции, плагины, очередь, кеш).

Все запросы проходят через **`Celena\Core\Kernel`**:

```
HTTP request → Kernel::boot() → Autoloader → Container → Config →
  Router::dispatch(Request) → Controller → Response → render
```

## Слои

| Слой | Папка | Зависимости |
|---|---|---|
| Ядро (без знаний о домене) | `core/` | `core/*` |
| Встроенные модули CMS | `modules/` | `core/*` |
| Плагины | `plugins/` | `core/*`, опц. другие плагины через манифест |
| Темы | `templates/` | только теги шаблонизатора |

## Контракты

- **Все классы** в namespace `Celena\Core\*`, `Celena\Module\<Name>\*`, `Celena\Plugin\<Slug>\*`, `Celena\Theme\<Slug>\*`.
- **Один класс — один файл**. PSR-4 через `core/Autoloader.php`, который знает о маппингах:
  - `Celena\Core\` → `core/`
  - `Celena\Module\` → `modules/`
  - `Celena\Plugin\` → `plugins/`
  - `Celena\Theme\` → `templates/`
- Везде `declare(strict_types=1)`, типы аргументов и возврата обязательны.
- Любой ввод проходит `Celena\Core\Security\Filter`. Любой вывод в HTML — через `e()` или auto-escape шаблонизатора.
- БД — только через `QueryBuilder` или `PDO::prepare`. Конкатенация в SQL — запрещена.

## Жизненный цикл запроса

1. `index.php` подключает `core/Autoloader.php` и вызывает `Kernel::boot(__DIR__)`.
2. `Kernel` строит `Container`, регистрирует `Config`, `Logger`, `Connection`, `Router`, `Engine`.
3. `Router` ищет маршрут (статический или параметризованный) и передаёт `Request` в обработчик.
4. Обработчик возвращает `Response` (html/json/redirect/file).
5. `Kernel::send($response)` отдаёт ответ.

## Хуки (action / filter)

```php
use Celena\Core\Plugin\Hook;

Hook::action('news.published', fn($news) => /* ... */);
$title = Hook::filter('news.title', $news->title);
```

Регистрация — в `plugin.php` плагина или в загрузке модуля.

## Кеш

- Default — файловый (`storage/cache/data`).
- Опциональные — APCu, Redis (через драйверы).
- Шаблоны компилируются в `storage/cache/tpl/{hash}.php`. Инвалидация по mtime + ручной flush.
