CLI-фреймворки для PHP: Symfony Console и Laravel Zero — полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

CLI-фреймворки для PHP: создаём мощные консольные приложения

Современная разработка на PHP не ограничивается веб-приложениями. Всё чаще разработчикам требуется создавать консольные (CLI) инструменты: обработчики очередей, миграции, генераторы отчётов, парсеры данных. Для этих задач существуют специализированные фреймворки, которые упрощают создание консольных команд, обработку аргументов, форматирование вывода и управление зависимостями.

Основные CLI-фреймворки для PHP

  • Symfony Console — самый популярный компонент от Symfony, используется в Laravel, Drupal, Composer и сотнях других проектов.
  • Laravel Zero — микро-фреймворк на основе Laravel, оптимизированный для CLI-приложений.
  • CLIFramework — лёгкий фреймворк с поддержкой Zsh/Bash автодополнения.
  • PHP CLI Tools — минималистичная библиотека для простых скриптов.

Symfony Console: универсальный стандарт

Компонент symfony/console является де-факто стандартом для CLI-приложений на PHP. Он предоставляет полный набор инструментов для создания команд, включая:

  • Автоматический разбор аргументов и опций командной строки.
  • Форматированный вывод с поддержкой цветов, таблиц и прогресс-баров.
  • Интерактивные вопросы и автодополнение.
  • Гибкую систему событий и жизненного цикла команды.
// Пример простой команды на Symfony Console
<?php
// файл: src/Command/GreetCommand.php
namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class GreetCommand extends Command
{
    protected static $defaultName = 'app:greet';

    protected function configure(): void
    {
        $this
            ->setDescription('Приветствует пользователя')
            ->addArgument('name', InputArgument::REQUIRED, 'Имя пользователя')
            ->addOption('yell', null, null, 'Вывести заглавными буквами');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $name = $input->getArgument('name');
        $message = "Привет, $name!";

        if ($input->getOption('yell')) {
            $message = strtoupper($message);
        }

        $output->writeln($message);
        return Command::SUCCESS;
    }
}

// Запуск: php bin/console app:greet Иван --yell

Laravel Zero: Laravel для командной строки

Laravel Zero — это микро-фреймворк, который переносит удобство Laravel (Eloquent ORM, Artisan, Blade, задачи по расписанию) в мир CLI. Он идеален для создания самостоятельных консольных утилит, не требующих веб-интерфейса.

Ключевые возможности Laravel Zero:

  • Знакомый синтаксис Artisan-команд.
  • Встроенная поддержка базы данных (SQLite, MySQL).
  • Планировщик задач (Cron-подобный функционал).
  • Форматирование вывода с помощью таблиц и прогресс-баров.
  • Возможность компиляции в единый PHAR-файл.
// Пример команды в Laravel Zero
<?php
// файл: app/Commands/ExportUsers.php
namespace App\Commands;

use Illuminate\Console\Command;
use App\Models\User;

class ExportUsers extends Command
{
    protected $signature = 'export:users {--format=csv : Формат вывода (csv/json)}';
    protected $description = 'Экспортирует список пользователей';

    public function handle(): int
    {
        $users = User::all(['id', 'name', 'email']);
        $format = $this->option('format');

        if ($format === 'json') {
            $this->line($users->toJson(JSON_PRETTY_PRINT));
        } else {
            $headers = ['ID', 'Имя', 'Email'];
            $this->table($headers, $users->toArray());
        }

        return Command::SUCCESS;
    }
}

// Запуск: php app export:users --format=json

Сравнение: когда что выбрать?

Рекомендаций