定制 stecman/symfony-console-completion 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

stecman/symfony-console-completion

Composer 安装命令:

composer require stecman/symfony-console-completion

包简介

Automatic BASH completion for Symfony Console Component based applications.

README 文档

README

Scrutinizer Code Quality

Latest Stable Version Total Downloads License PHP Version Require

This package provides automatic (tab) completion in BASH and ZSH for Symfony Console Component based applications. With zero configuration, this package allows completion of available command names and the options they provide. User code can define custom completion behaviour for argument and option values.

Example of zero-config use with Composer:

Composer BASH completion

Zero-config use

If you don't need any custom completion behaviour, you can simply add the completion command to your application:

  1. Install stecman/symfony-console-completion using composer by running:

    $ composer require stecman/symfony-console-completion
    
  2. For standalone Symfony Console applications, add an instance of CompletionCommand to your application's Application::getDefaultCommands() method:

    protected function getDefaultCommands()
    {
       //...
        $commands[] = new \Stecman\Component\Symfony\Console\BashCompletion\CompletionCommand();
       //...
    }

    For Symfony Framework applications, register the CompletionCommand as a service in app/config/services.yml:

    services:
    #...
        console.completion_command:
          class: Stecman\Component\Symfony\Console\BashCompletion\CompletionCommand
          tags:
              -  { name: console.command }
    #...
  3. Register completion for your application by running one of the following in a terminal, replacing [program] with the command you use to run your application (eg. 'composer'):

    # BASH ~4.x, ZSH
    source <([program] _completion --generate-hook)
    
    # BASH ~3.x, ZSH
    [program] _completion --generate-hook | source /dev/stdin
    
    # BASH (any version)
    eval $([program] _completion --generate-hook)

    By default this registers completion for the absolute path to you application, which will work if the program is accessible on your PATH. You can specify a program name to complete for instead using the --program option, which is required if you're using an alias to run the program.

  4. If you want the completion to apply automatically for all new shell sessions, add the command from step 3 to your shell's profile (eg. ~/.bash_profile or ~/.zshrc)

Note: The type of shell (ZSH/BASH) is automatically detected using the SHELL environment variable at run time. In some circumstances, you may need to explicitly specify the shell type with the --shell-type option.

The current version supports Symfony 6 and PHP 8.x only, due to backwards compatibility breaks in Symfony 6. For older versions of Symfony and PHP, use version 0.11.0.

How it works

The --generate-hook option of CompletionCommand generates a small shell script that registers a function with your shell's completion system to act as a bridge between the shell and the completion command in your application. When you request completion for your program (by pressing tab with your program name as the first word on the command line), the bridge function is run; passing the current command line contents and cursor position to [program] _completion, and feeding the resulting output back to the shell.

Defining value completions

By default, no completion results will be returned for option and argument values. There are two ways of defining custom completion values for values: extend CompletionCommand, or implement CompletionAwareInterface.

Implementing CompletionAwareInterface

CompletionAwareInterface allows a command to be responsible for completing its own option and argument values. When completion is run with a command name specified (eg. myapp mycommand ...) and the named command implements this interface, the appropriate interface method is called automatically:

class MyCommand extends Command implements CompletionAwareInterface
{
    ...

    public function completeOptionValues($optionName, CompletionContext $context)
    {
        if ($optionName == 'some-option') {
            return ['myvalue', 'other-value', 'word'];
        }
    }

    public function completeArgumentValues($argumentName, CompletionContext $context)
    {
        if ($argumentName == 'package') {
            return $this->getPackageNamesFromDatabase($context->getCurrentWord());
        }
    }
}

This method of generating completions doesn't support use of CompletionInterface implementations at the moment, which make it easy to share completion behaviour between commands. To use this functionality, you'll need write your value completions by extending CompletionCommand.

Extending CompletionCommand

Argument and option value completions can also be defined by extending CompletionCommand and overriding the configureCompletion method:

class MyCompletionCommand extends CompletionCommand
{
    protected function configureCompletion(CompletionHandler $handler)
    {
        $handler->addHandlers([
            // Instances of Completion go here.
            // See below for examples.
        ]);
    }
}

The Completion class

The following snippets demonstrate how the Completion class works with CompletionHandler, and some possible configurations. The examples are for an application with the signature:

`myapp (walk|run) [-w|--weather=""] direction`
Command-specific argument completion with an array
$handler->addHandler(
    new Completion(
        'walk',                    // match command name
        'direction',               // match argument/option name
        Completion::TYPE_ARGUMENT, // match definition type (option/argument)
        [                     // array or callback for results
            'north',
            'east',
            'south',
            'west'
        ]
    )
);

This will complete the direction argument for this:

$ myapp walk [tab]

but not this:

$ myapp run [tab]
Non-command-specific (global) argument completion with a function
$handler->addHandler(
    new Completion(
        Completion::ALL_COMMANDS,
        'direction',
        Completion::TYPE_ARGUMENT,
        function() {
            return range(1, 10);
        }
    )
);

This will complete the direction argument for both commands:

$ myapp walk [tab]
$ myapp run [tab]
Option completion

Option handlers work the same way as argument handlers, except you use Completion::TYPE_OPTION for the type.

$handler->addHandler(
    new Completion(
        Completion::ALL_COMMANDS,
        'weather',
        Completion::TYPE_OPTION,
        [
            'raining',
            'sunny',
            'everything is on fire!'
        ]
    )
);
Completing the for both arguments and options

To have a completion run for both options and arguments matching the specified name, you can use the type Completion::ALL_TYPES. Combining this with Completion::ALL_COMMANDS and consistent option/argument naming throughout your application, it's easy to share completion behaviour between commands, options and arguments:

$handler->addHandler(
    new Completion(
        Completion::ALL_COMMANDS,
        'package',
        Completion::ALL_TYPES,
        function() {
            // ...
        }
    )
);

Example completions

Completing references from a Git repository

new Completion(
    Completion::ALL_COMMANDS,
    'ref',
    Completion::TYPE_OPTION,
    function () {
        $raw = shell_exec('git show-ref --abbr');
        if (preg_match_all('/refs\/(?:heads|tags)?\/?(.*)/', $raw, $matches)) {
            return $matches[1];
        }
    }
)

Completing filesystem paths

This library provides the completion implementation ShellPathCompletion which defers path completion to the shell's built-in path completion behaviour rather than implementing it in PHP, so that users get the path completion behaviour they expect from their shell.

new Completion\ShellPathCompletion(
    Completion::ALL_COMMANDS,
    'path',
    Completion::TYPE_OPTION
)

Behaviour notes

  • Option shortcuts are not offered as completion options, however requesting completion (ie. pressing tab) on a valid option shortcut will complete.
  • Completion is not implemented for the --option="value" style of passing a value to an option, however --option value and --option "value" work and are functionally identical.
  • Value completion is always run for options marked as InputOption::VALUE_OPTIONAL since there is currently no way to determine the desired behaviour from the command line contents (ie. skip the optional value or complete for it)

stecman/symfony-console-completion 适用场景与选型建议

stecman/symfony-console-completion 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 26.56M 次下载、GitHub Stars 达 421, 最近一次更新时间为 2013 年 05 月 26 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 stecman/symfony-console-completion 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 stecman/symfony-console-completion 我们能提供哪些服务?
定制开发 / 二次开发

基于 stecman/symfony-console-completion 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 26.56M
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 424
  • 点击次数: 27
  • 依赖项目数: 60
  • 推荐数: 5

GitHub 信息

  • Stars: 421
  • Watchers: 10
  • Forks: 26
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2013-05-26