sonata / framework
Sonata PHP framework core
Installs: 7
Dependents: 2
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/sonata/framework
Requires
- php: ^8.3
- ext-json: *
- ext-pdo: *
- ramsey/uuid: ^4.7
- symfony/validator: ^7.1
This package is auto-updated.
Last update: 2026-02-07 11:48:03 UTC
README
Минималистичный PHP-фреймворк для быстрых API: роутинг на атрибутах, DI-контейнер, DTO-валидация и кеш роутинга.
Установка
composer require sonata/framework
Быстрый старт
Минимальная точка входа с роутингом и DI:
<?php use Sonata\Framework\Container\Container; use Sonata\Framework\Router; use Symfony\Component\Validator\Validation; use Symfony\Component\Validator\Validator\ValidatorInterface; require __DIR__ . '/vendor/autoload.php'; $_ENV['SONATA_BASE_PATH'] = __DIR__; putenv('SONATA_BASE_PATH=' . $_ENV['SONATA_BASE_PATH']); $container = new Container(); $container->set(ValidatorInterface::class, static function () { return Validation::createValidatorBuilder() ->enableAttributeMapping() ->getValidator(); }); $container->set(PDO::class, static function (): PDO { return new PDO( sprintf('mysql:host=%s;port=%d;dbname=%s', $_ENV['DB_HOST'], $_ENV['DB_PORT'], $_ENV['DB_NAME']), $_ENV['DB_USER'], $_ENV['DB_PASS'], [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); }); $router = new Router($container, $_ENV['APP_ENV'] === 'dev', null, __DIR__); $router->registerControllers(); $router->dispatch( parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) ?: '/', $_SERVER['REQUEST_METHOD'] );
Атрибуты (теги)
Используются для маршрутизации и документации:
#[Controller(prefix: '/api')]— объявляет контроллер и префикс.#[Route(path: '/users', method: 'GET', summary: '...', description: '...')]— маршрут метода.#[From('json'|'query'|'formData')]— источник данных для DTO.#[Inject]— внедрение зависимости в конструктор.#[Response(ClassName::class, isArray: true)]— тип ответа для OpenAPI.#[Tag('Имя', 'Описание')]— группа в документации.#[NoAuth]— пометка метода/контроллера, который не требует авторизации (используется middleware).
Пример:
use Sonata\Framework\Attributes\Controller; use Sonata\Framework\Attributes\Route; use Sonata\Framework\Attributes\From; use Sonata\Framework\Attributes\Tag; #[Controller(prefix: '/api')] #[Tag('Пользователи')] final class UserController { #[Route(path: '/users', method: 'POST', summary: 'Создать пользователя')] public function create(#[From('json')] UserCreateDto $dto): array { return ['ok' => true]; } }
Команды
В приложении можно добавить команды, которые используют встроенный кеш:
cache:build— построить кеш маршрутов (черезRoutesCache).cache:clear— очистить кеш маршрутов.
Middleware
Фреймворк поддерживает цепочку middleware для обработки запроса до контроллера.
Пример подключения:
$router = new Router($container, $debug, null, __DIR__); $router->addMiddleware(\App\Middleware\AuthMiddleware::class);
Middleware получает контекст:
controller— класс контроллераaction— метод контроллераuri,methodroute
Пример NoAuth
use Sonata\Framework\Attributes\NoAuth; final class AuthController { #[NoAuth] public function login(): array { /* ... */ } }
Логика
- Роутинг:
Routerсканирует контроллеры и строит маршруты по атрибутам. Поддерживаются параметры вида/users/{id}. - DI:
Containerавтосвязывает зависимости по типам,#[Inject]позволяет указывать явные идентификаторы. - Валидация: DTO наследуется от
ParamsDTOи валидируется черезsymfony/validator. - Кеш:
RoutesCacheкеширует список маршрутов,OpenApiCache— OpenAPI-спеку.
MediaHelper
Утилита для загрузки изображений, видео и документов из $_FILES.
Пример:
use Sonata\Framework\MediaHelper\MediaHelper; $media = new MediaHelper('/avatars'); $media->setNames(['avatar']); $result = $media->import();
Настройки через env:
MEDIA_UPLOAD_BASE— базовая папка загрузки (по умолчанию/upload-next).
Переменные окружения
SONATA_BASE_PATH— базовая директория приложения (для сканирования и кешей).APP_ENV— режим (dev/prod), влияет на кеши.