fidry/console

用于创建 CLI 应用程序的库


README

动机:此库的目的是为 console 命令和/或应用程序提供更轻量级且更健壮的 API,用于 symfony/console

它可以与 FrameworkBundle 结合使用以简化命令的创建,或者作为独立的包来创建 CLI 应用程序。

主要区别

  • 使用 IO 对象而不是 Input + Output + SymfonyStyle,它提供了
    • SymfonyStyle 的 API,但仍可访问 Input 和 Output 对象
    • 用于参数和选项的类型化 API(在强制转换为更严格的类型时验证输入)
  • 实现显式接口而不是扩展神级类

目录

使用 Symfony 安装

$ composer require theofidry/console

Symfony Flex 插件应添加以下内容

<?php declare(strict_types=1);
// config/bundles.php

return [
    // ...
    // Symfony\Bundle\FrameworkBundle\Symfony\Bundle\FrameworkBundle()
    // ...
    Fidry\Console\FidryConsoleBundle::class => ['all' => true],
];

使用预览

要实现命令,必须实现 Fidry\Console\Command\Command 接口,如下所示

<?php declare(strict_types=1);

namespace Acme;

use Acme\MyService;
use Fidry\Console\{ Command\Command, Command\Configuration, ExitCode, IO };
use Symfony\Component\Console\Input\InputArgument;

final class CommandWithService implements Command
{
    private MyService $service;

    public function __construct(MyService $service)
    {
        $this->service = $service;
    }

    public function getConfiguration(): Configuration
    {
        return new Configuration(
            'app:foo',
            'Calls MyService',
            <<<'EOT'
            The <info>%command.name</info> command calls MyService
            EOT,
            [
                new InputArgument(
                    'username',
                    InputArgument::REQUIRED,
                    'Name of the user',
                ),
                new InputArgument(
                    'age',
                    InputArgument::OPTIONAL,
                    'Age of the user',
                ),
            ],
        );
    }

    public function execute(IO $io): int
    {
        $this->service->call(
            $io->getTypedArgument('username')->asStringNonEmptyList(),
            $io->getTypedArgument('age')->asNullablePositiveInteger(),
        );

        return ExitCode::SUCCESS;
    }
}

启用包后,这些服务将自动配置为传统的 Symfony 命令。

已知限制

一些限制是由于没有足够的时间来处理这些或基于它们不是必要的假设。这些选择可能会根据所呈现的使用情况进行重新评估。

  • 支持隐藏命令(见文档
  • 支持命令别名
  • 支持命令使用配置
  • 一些 Application 的神秘方法

灵感

贡献

该项目提供了一个 Makefile,其中注册了最常见的命令,例如修复代码风格或运行测试。

# Print the list of available commands
make
# or
make help