Console
Console — оболочка над Symfony Console для PHP CLI-приложения. Она добавляет загрузку команд из каталога, передачу общей конфигурации и встроенные команды управления Server/сборкой PHAR.
Для простого собственного CLI можно отключить внутренние команды и зарегистрировать только нужные приложению. Это также исключит из его интерфейса операции загрузки PHP и изменения php.ini.
Установка
Заголовок раздела «Установка»composer config repositories.localzet-console vcs https://github.com/localzet/Consolecomposer require localzet/console:dev-mainМанифест задаёт symfony/console >=5.0, но исходный код использует PHP 8: promoted properties, union types, mixed и строковые функции PHP 8. Широкий диапазон зависимости не является доказательством совместимости с каждой major-версией Symfony; проверяйте ту версию, которую зафиксировал ваш lockfile.
Собственная команда
Заголовок раздела «Собственная команда»use localzet\Console;use localzet\Console\Commands\Command;use Symfony\Component\Console\Input\InputInterface;use Symfony\Component\Console\Output\OutputInterface;
require __DIR__ . '/vendor/autoload.php';
final class PingCommand extends Command{ protected static string $defaultName = 'ping'; protected static string $defaultDescription = 'Check the CLI entry point';
protected function execute(InputInterface $input, OutputInterface $output): int { $output->writeln('pong'); return self::SUCCESS; }}
$app = new Console(['name' => 'Example', 'version' => '1.0'], false);$app->add(new PingCommand());$app->run();Сохраните код в console.php и выполните php console.php ping. Аргумент false отключает автоматическое подключение внутренних команд; стандартные help и list остаются. Не запускайте CLI от root только ради обычной прикладной команды.
Возвращайте числовой exit code; стандартные SUCCESS/FAILURE наследуются от Symfony Command. Запись строки в Output сама по себе не задаёт результат процесса.
Команды из каталога
Заголовок раздела «Команды из каталога»$app->installCommands(__DIR__ . '/app/command', 'app\command');Метод рекурсивно ищет .php-файлы, выводит FQCN из относительного пути и namespace, проверяет доступность класса и наследование от localzet\Console\Commands\Command. Абстрактные классы пропускаются; остальные создаются с общей $config и добавляются в Application.
Настройте Composer autoload для namespace приложения заранее: сканирование файлов не заменяет автозагрузчик и не делает произвольный require каждого найденного файла. Имя файла и класс должны соответствовать ожидаемому FQCN. Не направляйте discovery на каталог, в который может писать недоверенный пользователь.
Конфигурация
Заголовок раздела «Конфигурация»$config = [ 'name' => 'Example', 'version' => '1.0', 'service' => ['mode' => 'preview'],];Console использует name и version в заголовке приложения. Если version не задан, обращается к Composer InstalledVersions для localzet/console.
Базовая Command получает массив конфигурации через конструктор. $this->config() возвращает его полностью; $this->config('service.mode', 'default') читает вложенное значение по точкам. Чтение использует isset(), поэтому сохранённое null также возвращает default. Интерполяции env и проверки schema конфигурации здесь нет.
Встроенные команды
Заголовок раздела «Встроенные команды»Внутренние команды включены по умолчанию. Их доступность зависит от конфигурации и загруженных классов:
help,list,version— справка и версии;start,stop,restart,reload,status,connections— делегирование lifecycle Server/приложения;build:phar,build:bin— упаковка, показываются при наличии секцииbuild;get:php— загрузка PHP runtime;fix-disable-functions— изменение loaded php.ini.
Lifecycle-команды не реализуют отдельный process manager. Они вызывают support\App::run() либо localzet\Server::runAll(); влияние аргументов зависит от вызываемого приложения. Не проверяйте stop/restart/reload на production-сервисе как безопасную проверку CLI.
Сборка PHAR
Заголовок раздела «Сборка PHAR»$config['build'] = [ 'input_dir' => __DIR__, 'output_dir' => __DIR__ . '/build', 'phar_filename' => 'example.phar', 'phar_alias' => 'example', 'phar_stub' => 'stub.php',];Создайте stub.php, который загружает приложение внутри архива. Для записи PHAR нужен соответствующий PHP extension и phar.readonly=0 в процессе сборки, например php -d phar.readonly=0 console.php build:phar.
Сборка удаляет ранее существовавший выходной PHAR. Перед упаковкой проверьте состав input и исключения: .env исключается по имени, но произвольные секреты, дампы и локальные ключи автоматически не распознаются. Лицензионные файлы зависимостей нужно включать в конечный дистрибутив независимо от исходных defaults исключения.
build:bin сначала выполняет PHAR-сборку, затем получает PHP micro-runtime и собирает единый бинарник. get:php и загрузчик micro-runtime отключают TLS peer verification и не проверяют криптографический digest скачанного runtime. Не используйте этот путь как доверенную supply-chain сборку без изменения загрузчика и проверки runtime-артефакта.
Параметры сборки, команды и вспомогательные методы
Исходный код · AGPL-3.0