Консоль — обзор
У каждого проекта Winter есть один бинарник — call. Он диспетчеризует
запуск во встроенные команды (генерация кода, конфиг, сервер, миграции, threads)
и в ваши собственные. Всё под единым разбором аргументов, флагов и опций.
Что такое консоль и зачем
Консоль — интерфейс командной строки фреймворка: единая точка для служебных задач вокруг проекта.
Проблема. Разработке нужен не только веб-цикл: сгенерировать класс, поднять сервер, накатить схему, собрать кеши, запустить фоновую задачу, разово прогнать скрипт. Без единого инструмента это набор разрозненных ad-hoc скриптов.
Решение. Winter даёт один бинарник call с набором встроенных команд и
простым способом добавить свои — с тем же разбором аргументов и той же DI. Об этом
и раздел.
Анатомия вызова
call <команда> [суб] [аргументы...] [-флаги] [--опции[=значение]]Разбор (CoreHandle::parser) раскладывает $argv на три корзины:
| Корзина | Источник | Пример |
|---|---|---|
arguments |
позиционные токены | call make .User → make, .User |
flags |
-x (одиночные буквы) |
-csr → c, s, r |
options |
--key или --key=v |
--port=8000, --mvc |
Первый позиционный аргумент — имя команды; без него запускается help. Имя
резолвится в класс Console\Command\<Name>. Есть два коротких алиаса:
| Алиас | Команда |
|---|---|
sc |
Script |
th |
Thread |
Встроенные команды
| Команда | Назначение | Страница |
|---|---|---|
help |
Список команд и справка | — |
make |
Генерация компонентов | make |
cfg |
Конфиг, .env, ключ, Docker, автодополнение |
cfg |
run |
Запуск HTTP-сервера (Swoole / dev) | run |
db |
Пинг / миграции / предпросмотр SQL | db |
mapping |
Кеш маршрутов: build / clean / show | mapping |
storage |
Инициализация и очистка storage/ |
storage |
script |
Запуск своих Cmd/CmdCustom (алиас sc) |
script |
thread |
Запуск Dispatchable-задач (алиас th) |
thread |
di |
Кеш DI-сканера: build / clean / show | di |
Своя команда
Команда — класс, наследующий Cmd, с тремя контрактными точками:
use Flytachi\Winter\Console\Inc\Cmd;
class Sync extends Cmd
{
public static string $title = "sync external data"; // строка в списке help
public function handle(): void
{
// тело команды — читаем $this->args['arguments'|'flags'|'options']
}
public static function help(): void
{
// печатается при call help sync и при -h / --help
}
}| Член | Роль |
|---|---|
static $title |
Однострочное описание в call help |
handle() |
Собственно работа |
static help() |
Подробная справка (call help <cmd> и -h) |
DI в командах
Команда создаётся через контейнер (Container::make), поэтому внедрение через
конструктор и #[Autowired] работает как в контроллерах:
class Sync extends Cmd
{
#[Autowired] private MyService $service;
public function handle(): void
{
$this->service->run();
}
}Cmd vs CmdCustom
| Аспект | Cmd |
CmdCustom |
|---|---|---|
Виден в call help |
да | нет |
| Запуск | call <name> |
call sc <dot.Path.Class> |
| Для чего | первоклассные команды | разовые проектные скрипты |
Скаффолд: php call make -n .Sync. Подробнее о запуске своих скриптов — на
странице script.
Вывод — Printer
Команды пишут через статические хелперы Printer (единый цветной формат) — не
через echo:
| Хелпер | Назначение |
|---|---|
printSuccess() / printError() |
[✓] успех / блок ошибки |
printInfo() / printWarning() |
[i] инфо / [!] предупреждение |
printKeyValue() |
выровненная пара ключ → значение |
printStep() |
индикатор прогресса [3/12] |
printTitle() / printList() |
баннер раздела / список |
Справка и автодополнение
call help # список всех команд + окружение
call help make # справка по команде
call make -h # то же через флаг
call cfg completion -i # установить автодополнение zsh/bash