Введение

Что такое Winter

Winter — PHP-фреймворк для API и веб-приложений. Маршруты, привязка параметров, валидация и работа с базой описываются атрибутами прямо в коде: ни конфиг-файлов, ни реестров, ни генерируемой «магии». Приложение при этом живёт резидентно и обслуживает запросы корутинами.

Язык PHP 8.4+Рантайм SwooleОбласть API · веб · фоновые сервисы

Для кого это

Как выглядит код

Контроллер — класс со стереотипом Controller, маршрут — атрибут на методе. Регистрировать больше ничего не нужно:

main/MainController.php
<?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: планировщик, очередь, набор консольных команд. Из чего состоит приложение, решает один атрибут на классе-точке входа.

С чего начать

bash
mkdir my-app && cd my-app
composer require flytachi/winter-kernel

Дальше — несколько шагов до работающего сервера:

Ссылки