Rudra FrameworkRudra Framework

1. Рендеринг

Основной рендеринг шаблонов

✅Rudra использует простой, но гибкий механизм рендеринга через функцию render():

render("layout", data());
  • Первый аргумент — имя шаблона (без расширения, например web/layout).
  • Второй — массив данных, доступных в шаблоне.

✅Шаблоны ищутся в папке, указанной в View::setup() (обычно в containerInit() базового контроллера контейнера):

View::setup(dirname(__DIR__) . "/Web/UI/tmpl", "Web_");

✅Шаблон web/layout будет загружен как Web/UI/tmpl/web/layout.php.

Добавление Twig

composer require "twig/twig:^3.0"

Создаем фабрику

<?php

namespace App\Containers\Web\Factory;

use Rudra\View\View;
use Rudra\View\TwigView;
use Rudra\Container\Interfaces\FactoryInterface;

class TwigFactory implements FactoryInterface
{
    public function create(): TwigView
    {
        $view = new TwigView();
        $view->setup(
            viewPath: dirname(dirname(__DIR__)) . '/Web/UI/tmpl',
            prefix: '',
            extension: 'twig'
        );

        return $view;
    }
}

Настраиваем сервис

<?php

use Rudra\View\View;
use Rudra\View\TwigView;
use App\Containers\Web\Factory\TwigFactory;

return [
    'contracts' => [

    ],
    'services'  => [
        // View::class => function () {
        //     $view = new TwigView();
        //     $view->setup(
        //         viewPath: dirname(__DIR__) . '/Web/UI/tmpl',
        //         prefix: '',
        //         extension: 'twig'
        //     );
        //     return $view;
        // }
        // View::class => fn() => (new TwigFactory())->create(),

        View::class => TwigFactory::class,
    ]
];

Вспомогательные функции

Функция

Назначение

data([...])

Устанавливает глобальные данные для шаблона (например, title, menus).

json($data)

Отправляет JSON-ответ с правильным Content-Type.

redirect($url)

Выполняет HTTP-редирект (код 302).

abort($code)

Возвращает HTTP-ошибку (например, abort(404)).

Все функции доступны глобально в контроллерах.


2. События (Event Dispatcher)

Rudra включает встроенную систему событий на основе паттерна Observer и Listener.

Два типа обработчиков

Тип

Использование

Регистрация

Listener

Однократная реакция на событие

Dispatcher::addListener('name', [Handler::class, 'method'])

Observer

Наблюдение за событием с контекстом

Dispatcher::attachObserver('name', [Handler::class, 'method'], $context)

Пример вызова:

Dispatcher::dispatch('message', __CLASS__);
Dispatcher::notify('one');
  • dispatch() — триггерит listeners.
  • notify() — уведомляет observers.

Регистрация обычно происходит в App\Ship\ShipController::eventRegistration().


Где используется

  • Логирование действий,
  • Отправка уведомлений,
  • Асинхронная обработка (в будущем),
  • Модификация поведения без изменения исходного кода.

3. Кэширование

✅Rudra поддерживает простое, но эффективное кэширование через функцию cache().

Базовое использование

// Получить или создать
$content = cache(['mainpage']) ?? view(["index", 'mainpage']);

// Сохранить с TTL (в секундах)
cache(['user_profile', $userId], $data, ttl: 3600);
  • Первый аргумент — ключ кэша (массив для группировки).
  • Второй (опционально) — значение для сохранения.
  • Третий — время жизни (TTL).

По умолчанию используется файловое кэширование (в папке Ship/Cache), но можно подключить Redis или Memcached через DI.


Очистка кэша

php rudra cache:clear

Очищает весь кэш приложения.

Также можно управлять кэшем программно через Rudra::get('cache').


Кэширование запросов к БД

✅Rudra позволяет кэшировать любые результаты, включая запросы к БД и последующую обработку.

Пример: кэширование древовидного меню

// 1. Получаем все активные категории из БД (запрос кэшируется)
$categories = $category->cache(['getAllActive_categories']);

// 2. Строим древовидную структуру — и тоже кэшируем результат
$categoryMenu = $category->cache([
    'buildTree_categoryMenu',
    [array_filter($categories, fn($c) => $c['id'] != 1), 1]
]);
  • Первый вызов cache(['ключ']) сохраняет результат метода $category->getAllActive().
  • Второй — кэширует результат $category->buildTree(...) с конкретными аргументами.
  • При повторном запросе БД не трогается — данные берутся из кэша.

Как это работает

Если вызвать $model->cache($key), Rudra:

  1. Проверяет наличие данных по ключу $key.
  2. Если нет — автоматически вызывает метод с именем, производным от ключа:
    • 'getAllActive_categories' → вызывается $category->getAllActive()
    • 'buildTree_categoryMenu' → вызывается $category->buildTree(...)
  3. Сохраняет результат и возвращает его.

Это означает: имя ключа должно соответствовать имени метода модели.


Преимущества

  • Нет дублирования кода — один вызов вместо if/else + get + set.
  • Прозрачность — вы видите, что кэшируется, и что вызывается.
  • Производительность — тяжёлые операции (например, рекурсивное построение дерева) выполняются только один раз.

Интеграция в жизненный цикл

  • Рендеринг — финальный шаг в контроллере.
  • События — могут триггериться в любом месте (контроллер, сервис, middleware).
  • Кэширование — используется для ускорения повторяющихся операций (рендеринг шаблонов, запросы к БД).