Начало работы

Быстрый старт

Соберём первый маршрут от начала до видимого результата: создадим проект, добавим контроллер, поднимем сервер и получим JSON-ответ. Займёт пять минут.

1. Проект

bash
composer create-project flytachi/winter my-app
cd my-app

Подробности и требования — на странице Установка.

2. Контроллер

Сгенерируем контроллер командой make (точка перед именем — обязательна; суффикс Controller генератор добавит сам):

bash
php call make -c .Greet   # → main/GreetController.php

Файл main/GreetController.php появится и сразу подключится к автозагрузке. Приведём его к такому виду — маршрут GET /api/hello/{name}, возвращающий JSON:

main/GreetController.php
<?php

namespace Main;

use Flytachi\Winter\K2\Http\Request\Annotation\PathVariable;
use Flytachi\Winter\K2\Http\Response\ResponseEntity;
use Flytachi\Winter\K2\Route\Annotation\GetMapping;
use Flytachi\Winter\K2\Route\Annotation\RequestMapping;
use Flytachi\Winter\K2\Stereotype\Controller;

#[RequestMapping('api')]
class GreetController extends Controller
{
  #[GetMapping('hello/{name}')]
  public function hello(#[PathVariable] string $name): ResponseEntity
  {
      return ResponseEntity::ok(['message' => "Hello, {$name}"]);
  }
}

Что здесь происходит:

  • #[RequestMapping('api')] на классе — общий префикс /api для всех методов.
  • #[GetMapping('hello/{name}')] — маршрут GET /api/hello/{name}.
  • #[PathVariable] привязывает сегмент {name} к аргументу $name.
  • ResponseEntity::ok([...]) отдаёт 200 OK с телом в JSON.

Регистрировать маршрут не нужно — сканер найдёт его сам.

3. Запуск

bash
php call run dev

Сервер поднимется на http://0.0.0.0:8000.

4. Результат

bash
curl http://0.0.0.0:8000/api/hello/Winter
json
{"message":"Hello, Winter"}

Или откройте http://0.0.0.0:8000/api/hello/Winter в браузере — увидите тот же JSON.

Маршрут не найден?

В режиме разработки (DEBUG=true) маршруты сканируются на каждый запрос, так что новый контроллер виден сразу. Список всех маршрутов — php call mapping show.

5. Чуть больше: query-параметр

Добавим необязательный параметр ?shout=true через #[RequestQuery]:

main/GreetController.php
#[GetMapping('hello/{name}')]
public function hello(
  #[PathVariable] string $name,
  #[RequestQuery] bool $shout = false,
): ResponseEntity {
  $message = "Hello, {$name}";
  return ResponseEntity::ok(['message' => $shout ? strtoupper($message) : $message]);
}
bash
curl 'http://0.0.0.0:8000/api/hello/Winter?shout=true'
json
{"message":"HELLO, WINTER"}

Не забудьте импорт use Flytachi\\Winter\\K2\\Http\\Request\\Annotation\\RequestQuery;.

Весь код целиком

main/GreetController.php
<?php

namespace Main;

use Flytachi\Winter\K2\Http\Request\Annotation\PathVariable;
use Flytachi\Winter\K2\Http\Request\Annotation\RequestQuery;
use Flytachi\Winter\K2\Http\Response\ResponseEntity;
use Flytachi\Winter\K2\Route\Annotation\GetMapping;
use Flytachi\Winter\K2\Route\Annotation\RequestMapping;
use Flytachi\Winter\K2\Stereotype\Controller;

#[RequestMapping('api')]
class GreetController extends Controller
{
  #[GetMapping('hello/{name}')]
  public function hello(
      #[PathVariable] string $name,
      #[RequestQuery] bool $shout = false,
  ): ResponseEntity {
      $message = "Hello, {$name}";
      return ResponseEntity::ok(['message' => $shout ? strtoupper($message) : $message]);
  }
}

Дальше