Введение

Философия

Winter стоит на трёх принципах. Они определяют, как выглядит код, и почему фреймворк удобно брать в команду: меньше скрытого поведения, меньше рутины, предсказуемая производительность.

Явное лучше неявного

Поведение живёт в коде, а не в отдельных конфигах, которые надо держать в голове. Маршрут — это атрибут на методе; привязка тела запроса — атрибут на параметре; колонка таблицы — атрибут на свойстве сущности. Что видите, то и работает.

main/Controllers/AuthController.php
#[RequestMapping('auth')]
class AuthController extends Controller
{
  #[PostMapping('login')]
  public function login(#[RequestJson, Valid] LoginRequest $req): ResponseEntity
  {
      // маршрут, метод, привязка и валидация — всё видно здесь
      return ResponseEntity::ok(/* ... */);
  }
}

Никакой «магии»: каждый слой заменяем, а поведение можно проследить по атрибутам, не заглядывая во внутренности фреймворка.

CLI вместо обвязки

Рутину пишет генератор, а не вы. Команда call make создаёт контроллеры, сервисы, репозитории, middleware, джобы и команды из шаблонов и сразу подключает их к автозагрузке:

bash
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) задают единую структуру — новый разработчик узнаёт её с первого проекта.
  • Меньше дрейфа. Нет параллельных конфигов, которые расходятся с кодом.
  • Предсказуемость. Явные атрибуты и заменяемые слои упрощают ревью и отладку.

Дальше