Skip to content

v3 upgrade to v4

Inhere edited this page Oct 16, 2021 · 8 revisions

v3升级到v4

  • PHP 版本需要 7.3+

大部分都是兼容的,唯有选项参数的解析、绑定变动较大。之前获取输入参数、选项都是通过 Input 对象,v4 重构了选项参数的解析。

  • 提供了新的 FlagsParser 对象来解析和管理输入的选项参数。
  • 使用上更加简单易用
    • 废弃了之前的 InputDefinition 对象
    • 废弃了之前的 Input 对象上的各种 getXXXOpt() getXXXArg() 方法
  • 方法注释的 @options @arguments 功能增强
    • 使用 ; 分割各个设置项,完整规则格式 type;desc;required;default;shorts
    • 支持设置数据类型,不设置默认为 string
    • 支持设置是否必须 required 等等
  • 只需通过 FlagsParser $fsgetOpt() getArg() 获取选项、参数值
    • 输入的值在解析绑定时就已经根据设置的类型自动格式化了
    • 不在需要原来的通过 input->getXXXOpt() 等各种手动格式化类型的方法

升级改动说明:

  • 将原来的 $input->getXXXOpt() 替换为 $fs->getOpt()
  • 将原来的 $input->getXXXArg() 替换为 $fs->getArg()
  • 方法上的@options @arguments注释内容会被严格解析,因此名称和后面的规则至少需要间隔两个空格

v4示例 - 通过注释绑定选项参数:

    /**
     * show next execution datetime for an cron expression.
     *
     * @arguments
     *  expression      string;The cronTab expression. eg: `20 10 * * *`;required
     *
     * @options
     *  -n, --next      int;Show next number exec datetime. default number is 3.
     *  -p, --prev      bool;Show previsions exec datetime
     *
     * @param FlagsParser $fs
     * @param Output $output
     *
     * @throws Exception
     */
    public function someCommand(FlagsParser $fs, Output $output): void
    {
        $expr = $fs->getArg('expression'); // will get string value
        $prev = $fs->getOpt('prev'); // will get bool value

        $nextNum  = $fs->getOpt('next', 3); // will get int value

        $output->colored('Cron Expression: ' . $expr);
    }

v4示例 - 通过注释绑定选项参数:

    /**
     * Configure for the subcommand `some`
     */
    protected function someConfigure(): void
    {
        // 在独立命令里
        // $fs = $this->getFlags();
        // 在group的子命令里
        $fs = $this->getActionFlags();

        $fs->addArg('topic', 'The language/topic for search. eg: go, php, java, lua, python, js ...');
        $fs->addArg('question', 'The question search.');

        $fs->addOpt('search', 's', 'search by the keywords');
        // $fs->addOpt('T', 't', 'query');

        $fs->setMoreHelp(<<<HELP
<b>Special pages</b>
There are several special pages that are not cheat sheets. Their names start with colon and have special meaning.

.... ...
HELP
        );
        $fs->setExampleHelp([
            '{fullCmd} go reverse list'
        ]);
    }