BMC IO DocsBMC IO Docs
IO v6
IO v7
Notes
Docs
IO v6
IO v7
Notes
Docs
  • IO Framework v7

    • О фреймворке
    • Что изменилось в 7 версии
    • IO7 Framework vs Laravel 13 — Сравнение
    • Структура
    • Варианты проектов
    • Доступ к участкам проекта
    • Разворачивание нового проекта
    • Установка проекта
    • Запуск локальной разработки
  • API

    • Обзор API
    • IOCore::call() и IOCore::callAction()
    • Создание API
  • CLI

    • Обзор CLI
    • iocli
    • Кастомные CLI команды
  • Работа с базами данных

    • Обзор работы с базами данных
    • Cron / Планировщик задач (Schedule)
    • Фабрики
    • Миграции
    • Сидеры
    • Query Builder
    • Подключение MinIO
    • Подключение MongoDB
    • Подключение MySQL
    • Подключение PostgreSQL
    • Подключение ProxySQL
    • Подключение RabbitMQ
    • Подключение Redis
  • Логирование

    • Обзор логирования
    • IOEvent - Логирование событий
    • Pinba (PinbaManager) - Профилировщик
  • Модели

    • Обзор моделей
    • CRUD операции
    • Связи моделей
  • Очереди

    • Обзор очередей
    • RabbitMQ
  • Маршруты

    • Обзор маршрутов
    • Определение маршрутов
    • Middleware
  • Сессии

    • Обзор сессий
    • Кроссдоменная SSO
    • JWT авторизация
    • Социальная авторизация
    • OAuth2
    • Keycloak
  • Twig

    • Обзор Twig
    • Формы (FormBuilder)
    • Twig функции
  • Тестирование

    • Обзор тестирования
    • Unit тесты
  • Backend

    • Настройки проекта Conf.php
    • Настройки модуля Module.php
    • Настройки composer
    • Функции фреймворка
    • Вспомогательные функции (Helpers)
    • Глобальные переменные
    • Константы фреймворка
    • Event класс
    • Core класс
    • Route и работа с ними
    • Request и работа с ними
    • Middleware и работа с ними
    • Class и работа с ними
    • Api model и работа с ними
    • Template и работа с ними
    • Мультиязычность и словарь фраз
    • Bin скрипты и работа с ними
    • Cron скрипты и работа с ними
    • $ioSession и работа с сессией
    • $ioHash и работа с кешем
    • $ioXCache и работа с кешем
    • $iodb и работа с базой данных
    • Миграции
  • Frontend

    • Twig шаблонизатор и работа с ним
    • Twig функции
    • Twig фильтры
    • Twig контекст
    • Настройка NPM
    • Сборка Frontend составляющей
    • Обращение к Api через JS
    • Хранилище (store)
    • Навигация в хосте
    • Навигация в микрофронтенде
    • Параметры микрофронтенда
    • Проверка полномочий
  • Tailux UI Компоненты

    • Базовый UI

      • AvatarDot
      • Avatar
      • Badge
      • Button
      • Card
      • ConfirmModal
      • Divider
      • Highlight
      • Tag
    • Загрузка

      • Circlebar
      • Progress
      • Skeleton
      • Spinner
    • Навигация

      • Accordion
      • AccordionButton
      • AccordionHeader
      • AccordionItem
      • AccordionPanel
      • AccordionProvider
      • Pagination
      • PaginationControl
      • PaginationItems
      • PaginationDots
      • PaginationFirst
      • PaginationLast
      • PaginationNext
      • PaginationPrevious
    • Отображение данных

      • Box
      • Collapse
      • ContextualHelp
      • ScrollShadow
      • Timeline
      • TimelineItem
    • Элементы таблиц

      • Table
      • CollapsibleSearch
      • ColumnFilter
      • CopyableCell
      • DateFilter
      • FacetedFilter
      • FilterSelector
      • PaginationSection
      • RadioFilter
      • RangeFilter
      • ResponsiveFilter
      • RoleFilter
      • SelectedRowsActions
      • TableColumnVisibility
      • TableSettings
      • TableSortIcon
    • Элементы форм

      • Checkbox
      • Combobox
      • DatePicker
      • Filepond
      • Input
      • Listbox
      • Radio
      • Range
      • Select
      • StyledSwitch
      • Swap
      • SwapOn
      • SwapOff
      • Switch
      • Textarea
      • TextEditor
      • Upload

Middleware IO7

Внимание

Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!

  • Интерфейс IO\Middleware
    • handle()
    • terminate()
  • Создание middleware
  • Подключение middleware
    • В конфигурации маршрута
    • Через Route::addMiddleware()
  • Встроенные middleware
    • AuthMiddleware
    • ThrottleMiddleware
    • CorsMiddleware
    • Другие встроенные middleware
  • Цепочка middleware
  • Пример: полная конфигурация
  • См. также

Middleware выполняется до и после обработчика маршрута. Каждый middleware реализует интерфейс IO\Middleware.


Интерфейс IO\Middleware

namespace IO;

interface Middleware
{
    public function handle(App $app, ?Route $route, array $params = []): mixed;
    public function terminate(App $app, ?Route $route, mixed $response, array $params = []): void;
}

handle()

Вызывается до обработчика маршрута.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$appApp—ДаЭкземпляр приложения
$route?RoutenullНетЭкземпляр маршрута (null при вызове из конфигурации)
$paramsarray[]НетПараметры middleware

Возвращает: null (продолжить) или array|string (прервать выполнение).

terminate()

Вызывается после обработчика маршрута.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$appApp—ДаЭкземпляр приложения
$route?RoutenullНетЭкземпляр маршрута
$responsemixed—ДаОтвет маршрута
$paramsarray[]НетПараметры middleware

Создание middleware

namespace App\Middlewares;

use IO\App;
use IO\Middleware;
use IO\Route;

class MyMiddleware implements Middleware
{
    public function handle(App $app, ?Route $route, array $params = []): mixed
    {
        $token = $params['token'] ?? '';

        if ($token !== 'valid') {
            return ['error_code' => 403, 'error_str' => 'Forbidden'];
        }

        $route->set('authorized', true);

        return null;
    }

    public function terminate(App $app, ?Route $route, mixed $response, array $params = []): void
    {
        // Логирование, очистка кеша и т.д.
    }
}

Подключение middleware

В конфигурации маршрута

$app->add_route([
    'url'        => '/admin/dashboard',
    'type'       => ['get'],
    'class_name' => \App\Routes\AdminRoute::class,
    'method'     => 'index',
    'middleware'  => [
        \IO\Middlewares\AuthMiddleware::class,
        \App\Middlewares\AdminCheck::class,
    ],
]);

С параметрами:

$app->add_route([
    'url'        => '/api/data',
    'type'       => ['get'],
    'class_name' => \App\Routes\ApiRoute::class,
    'method'     => 'getData',
    'middleware'  => [
        \IO\Middlewares\ThrottleMiddleware::class => ['requests' => 100, 'window' => 3600],
    ],
]);

Через Route::addMiddleware()

class AdminRoute extends \IO\Route
{
    public function init(): void
    {
        $this->addMiddleware(\App\Middlewares\AuditMiddleware::class, [
            'log_level' => 'info',
        ]);

        parent::init();
    }

    public function dashboard(): \IO\Response
    {
        // ...
    }
}

Встроенные middleware

AuthMiddleware

Проверка авторизации.

use IO\Middlewares\AuthMiddleware;

// С редиректом на страницу логина
$middleware = new AuthMiddleware('/login');

// С JSON-ответом (для API)
$middleware = new AuthMiddleware('/login', true);

Данные в контексте маршрута:

КлючОписание
userДанные пользователя
user_idID пользователя
user_loginЛогин пользователя
permissionsРазрешения (кабинеты)
current_accountТекущий аккаунт
current_cabinetТекущий кабинет
class AdminRoute extends \IO\Route
{
    public function index(): \IO\Response
    {
        $user_id = $this->get('user_id');
        $user = $this->get('user');
        // ...
    }
}

ThrottleMiddleware

Троттлинг запросов по пользователям/IP.

use IO\Middlewares\ThrottleMiddleware;

$middleware = new ThrottleMiddleware([
    'default' => ['requests' => 100, 'window' => 3600],  // 100/час
    'auth'    => ['requests' => 20,  'window' => 60],     // 20/мин
    'api'     => ['requests' => 500, 'window' => 3600],   // 500/час
]);

Заголовки ответа:

ЗаголовокОписание
X-RateLimit-LimitМаксимум запросов
X-RateLimit-RemainingОставшиеся запросы
X-RateLimit-ResetВремя сброса лимита

CorsMiddleware

Обработка CORS-запросов.

use IO\Middlewares\CorsMiddleware;

$middleware = new CorsMiddleware('myproject', ['https://example.com']);

Другие встроенные middleware

КлассОписание
SecurityHeadersMiddlewareБезопасные HTTP-заголовки
CacheMiddlewareHTTP-кэширование
CsrfMiddlewareЗащита от CSRF
LoggingMiddlewareЛогирование запросов
PerformanceMiddlewareЗамер производительности
RequestIdMiddlewareУникальный ID запроса
RateLimitMiddlewareОбщий троттлинг
SanitizeMiddlewareОчистка данных
CompressionMiddlewareСжатие ответа
IpWhitelistMiddlewareБелый список IP
MaintenanceMiddlewareРежим обслуживания
DebugBarMiddlewareПанель отладки
ValidationMiddlewareВалидация запросов

Цепочка middleware

Middleware выполняются последовательно:

请求 → Middleware1::handle() → Middleware2::handle() → Маршрут → Middleware2::terminate() → Middleware1::terminate() → Ответ

Если любой middleware возвращает не-null, выполнение прерывается:

public function handle(App $app, ?Route $route, array $params = []): mixed
{
    if (!$this->checkAccess()) {
        return ['error_code' => 403, 'error_str' => 'Forbidden'];
    }
    return null;
}

Пример: полная конфигурация

$app->add_route([
    'url'        => '/api/admin/users',
    'type'       => ['get', 'post'],
    'class_name' => \App\Routes\AdminRoute::class,
    'method'     => 'handle',
    'middleware'  => [
        \IO\Middlewares\CorsMiddleware::class,
        \IO\Middlewares\AuthMiddleware::class,
        \IO\Middlewares\ThrottleMiddleware::class,
        \App\Middlewares\AdminCheck::class,
    ],
]);
Запрос → CorsMiddleware → AuthMiddleware → ThrottleMiddleware → AdminCheck → AdminRoute::handle()

См. также

  • Обзор маршрутов
  • Определение маршрутов