Что такое Winter
Winter — PHP-фреймворк для API и веб-приложений. Маршруты, привязка параметров, валидация и работа с базой описываются атрибутами прямо в коде: ни конфиг-файлов, ни реестров, ни генерируемой «магии». Приложение при этом живёт резидентно и обслуживает запросы корутинами.
Для кого это
- Архитекторам и тимлидам — оценить фреймворк для команды: Философия и Экосистема.
- Разработчикам — начать писать код: Установка и Быстрый старт доведут до первого маршрута.
- Тем, кто уже в деле — Ключевые понятия собирают всю ментальную модель в одном месте.
Как выглядит код
Контроллер — класс со стереотипом Controller, маршрут — атрибут на методе.
Регистрировать больше ничего не нужно:
<?php
namespace Main;
use Flytachi\Winter\Kernel\Http\Response\ResponseEntity;
use Flytachi\Winter\Kernel\Http\Stereotype\Controller;
use Flytachi\Winter\Kernel\Route\Annotation\GetMapping;
class MainController extends Controller
{
#[GetMapping]
public function index(): ResponseEntity
{
return ResponseEntity::ok('Hello, Winter');
}
}Это уже рабочий маршрут GET /. Полный сквозной пример — в
Быстром старте.
Три принципа
Кратко здесь, подробно — в Философии.
Явное лучше неявного. Поведение видно в том же файле, что и код: атрибут на методе — это и есть маршрут. Ничего не спрятано в конфигах, которые надо не забыть обновить при переименовании.
CLI вместо обвязки. Компоненты создаёт генератор call make, маршруты
показывает call mapping show, окружение готовит call cfg. Копипаст каркаса не
нужен.
Производительность по умолчанию. Приложение поднимается один раз и остаётся в памяти; дорогая работа — скан проекта, сборка контейнера, построение таблицы маршрутов — происходит до первого запроса, а не на каждом.
Пришли из Laravel или Symfony?
Понятия те же — контроллеры, DI, middleware, репозитории, — так что читается с листа. Отличия, которые стоит заметить сразу: приложение не умирает после запроса, а объект по умолчанию transient, а не singleton. Оба разобраны в Ключевых понятиях.
Что умеет
| Возможность | Как это выглядит |
|---|---|
| Маршрутизация | #[GetMapping], #[PostMapping] на методах; таблица строится сама |
| Привязка запроса | #[PathVariable], #[RequestQuery], #[RequestJson], #[RequestForm], #[RequestFile] |
| Валидация | #[Valid] и 24 ограничения: #[NotBlank], #[Size], #[Email], #[Uuid]… |
| Работа с БД (PPA) | Репозитории и сущности на атрибутах, конструктор запросов, миграции из кода |
| Контейнер | Автовайринг без регистрации, три области видимости, проверка их сочетаний при старте |
| Фон и расписание | Процессы, демоны с воркерами, #[Scheduled], параллельные вызовы #[Async] |
Консоль (call) |
Генераторы, свои команды, запуск сервера, автодополнение в shell |
| Наблюдаемость | Логирование по каналам, /actuator для проверок здоровья |
Чем Winter отличается
Три решения, определяющие ощущение от работы:
Приложение резидентно. Классический PHP поднимает окружение на каждый запрос и уничтожает его после. Winter запускается один раз, а запросы обрабатывает корутинами: пока один ждёт базу, воркер выполняет другой. Отсюда и скорость, и новые правила про состояние.
Ничего не регистрируется. При старте фреймворк обходит проект и находит контроллеры, конфигурации, процессы сам. Создали класс — он работает. Списков, которые надо не забыть пополнить, попросту нет.
Веб — не обязателен. Тот же код и тот же контейнер обслуживают приложение без HTTP: планировщик, очередь, набор консольных команд. Из чего состоит приложение, решает один атрибут на классе-точке входа.
С чего начать
mkdir my-app && cd my-app
composer require flytachi/winter-kernelДальше — несколько шагов до работающего сервера:
- Установка — собрать проект с нуля и запустить
- Быстрый старт — первый маршрут
- Ключевые понятия — как всё устроено
Ссылки
- Ядро: github.com/flytachi/winter-kernel
- Сайт: winterframe.net