Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何动态提取参数? #27

Open
lkeme opened this issue May 28, 2022 · 8 comments
Open

如何动态提取参数? #27

lkeme opened this issue May 28, 2022 · 8 comments
Assignees
Labels

Comments

@lkeme
Copy link

lkeme commented May 28, 2022

WIKI没看到相应的文档

  1. param*是动态的 如何获取使用?
app.php a:{param1} b:{param2}
  1. 如何忽略一些固定位置的argv
app.php {fixed_position}  test:test
...
[ERROR] The command 'fixed_position' is not exists!
@inhere inhere self-assigned this May 28, 2022
@inhere
Copy link
Owner

inhere commented May 28, 2022

  1. 参数是根据位置读取的,推荐使用选项 --name value
  2. app.php 是应用入口,接下来的就是 命令名称 这是必须的

关于控制台命令,可以再看下文档,还有我新增了一些使用说明:

https://github.com/inhere/php-console/wiki/about-console-command

如果你只想构建一个简单的命令可以使用我的 php-toolkit/pflag 库, php-console 是基于它构建复杂应用的。

https://github.com/php-toolkit/pflag/blob/main/README.zh-CN.md#%E5%88%9B%E5%BB%BA%E7%AE%80%E5%8D%95%E7%9A%84%E7%8B%AC%E7%AB%8B%E5%91%BD%E4%BB%A4%E6%88%96%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F

@lkeme
Copy link
Author

lkeme commented May 29, 2022

console比较符合需要,有使用到Controllers Commands的架构

php app.php --name {value} test:test

其他都比较好,需求是用想省略参数,--name是固定位置(都在app.php后面一位),且是必要参数。

php app {value} test:test

可用其他方案实现需求,但会出现 is not exists

另外才发现,想用到的好几个库都是你的,slog、config、stdlib、console...

@inhere
Copy link
Owner

inhere commented May 29, 2022

命令行应用应当遵循通用的命令规范,方便使用

image

最后的参数是可以省略的,console 里可以按位置给参数命名,可以设置非必须,用的时候使用名字获取就行

来自 wiki https://github.com/inhere/php-console/wiki/v4-create-command

    /**
     * @param FlagsParser $fs
     *
     * @return void
     */
    protected function configFlags(FlagsParser $fs): void
    {
        $fs->addOptByRule('search, s', 'string;input keywords for search');

        // 绑定参数 非必须的 可以不传,获取到就是空string
        $fs->addArg('keywords', 'the keywords for search or show docs', 'string');
    }

    protected function execute(Input $input, Output $output)
    {
        $keywords = $this->flags->getOpt('search');

	$name = $this->flags->getArg('keywords');
	// 也可以按位置取
	// $name = $this->flags->getFirstArg();
    }

哈哈 对的。我建了好几个组织,分别放不同语言、类型的库和包

@inhere
Copy link
Owner

inhere commented May 29, 2022

@deliangyang
Copy link

命令行“遵循通用的命令规范”看起来是后面支持的吗?从低版本升级到现在的版本“4.1.6”,发现如果 ARGUMENTS 在 --OPTIONS 前面,无法获取到 --OPTIONS 的值

@inhere
Copy link
Owner

inhere commented Mar 27, 2024

命令行“遵循通用的命令规范”看起来是后面支持的吗?从低版本升级到现在的版本“4.1.6”,发现如果 ARGUMENTS 在 --OPTIONS 前面,无法获取到 --OPTIONS 的值

按规范 ARGS 只能在 OPTIONS 后面,遇到 args 就会停止解析。

@deliangyang
Copy link

自从升级该依赖到最新版本后,给我的同事带来了不少的困恼。以前可选和参数的顺序可以互换,升级之后,顺序必须遵循:“可选”后面跟随“参数”。

终于在 GUN 找到了官方解释 Argument-Syntax

The argument -- terminates all options; any following arguments are treated as non-option arguments, even if they begin with a hyphen.

@inhere
Copy link
Owner

inhere commented Apr 27, 2024

:) 之前没按严格规范解析,用着是灵活简单一些。 但遇到一些特殊场景不能处理,可能会导致解析出错误的结果。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants