Философия
Winter стоит на трёх принципах. Они определяют, как выглядит код, и почему фреймворк удобно брать в команду: меньше скрытого поведения, меньше рутины, предсказуемая производительность.
Явное лучше неявного
Поведение живёт в коде, а не в отдельных конфигах, которые надо держать в голове. Маршрут — это атрибут на методе; привязка тела запроса — атрибут на параметре; колонка таблицы — атрибут на свойстве сущности. Что видите, то и работает.
#[RequestMapping('auth')]
class AuthController extends Controller
{
#[PostMapping('login')]
public function login(#[RequestJson, Valid] LoginRequest $req): ResponseEntity
{
// маршрут, метод, привязка и валидация — всё видно здесь
return ResponseEntity::ok(/* ... */);
}
}Никакой «магии»: каждый слой заменяем, а поведение можно проследить по атрибутам, не заглядывая во внутренности фреймворка.
CLI вместо обвязки
Рутину пишет генератор, а не вы. Команда call make создаёт контроллеры,
сервисы, репозитории, middleware, джобы и команды из шаблонов и сразу подключает
их к автозагрузке:
php call make -c .User # → main/UserController.php
php call make -r .User # → main/UserRepository.php
php call make -s .User # → main/UserService.phpТот же call поднимает сервер, собирает кеши, гоняет миграции и запускает фоновые
задачи. Один инструмент на весь жизненный цикл проекта. См. CLI.
Производительность по умолчанию
Быстро — это состояние по умолчанию, а не результат тюнинга.
- Кеш маршрутов и DI. В продакшене (
DEBUG=false) таблица маршрутов и граф зависимостей читаются из кеша, а не пересканируются на каждый запрос. - Диспетчеризация за O(1). Статические маршруты резолвятся по карте, динамические — по чанкованному regex.
- Один код — три рантайма. Тот же проект работает под PHP-FPM, Swoole и в CLI без изменений в коде приложения.
Заметка
В разработке (DEBUG=true) кеши отключены — маршруты и DI сканируются каждый
запрос, так что новый контроллер виден сразу, без ручной пересборки.
Что это даёт команде
- Онбординг быстрее. Стереотипы (
Controller,Service,Repository,Job) задают единую структуру — новый разработчик узнаёт её с первого проекта. - Меньше дрейфа. Нет параллельных конфигов, которые расходятся с кодом.
- Предсказуемость. Явные атрибуты и заменяемые слои упрощают ревью и отладку.
Дальше
- Ключевые понятия — стереотипы, атрибуты, DI и
Bootна одной странице - Экосистема — из чего собран фреймворк