zoukankan      html  css  js  c++  java
  • thinkphp6 command(自定义指令)

    步骤:

    执行命令:php think hello xiaoming zhangsan

    1. command文件夹中创建自定义指令php class文件,且继承 thinkconsoleCommand类

    2. 包含 configure、execute方法

    3.console.php 添加命令

    
    

    #使用控制台参数
    #参数是字符串,多个参数由空格分隔,并且跟在命令名称的后面。参数是有顺序的,而且可以是可选的或必须的。例如,添加一个可选的 last_name 参数到命令中,并且令 name 参数必填:

    #使用控制台参数
    #参数是字符串,多个参数由空格分隔,并且跟在命令名称的后面。参数是有顺序的,而且可以是可选的或必须的。例如,添加一个可选的 last_name 参数到命令中,并且令 name 参数必填:

    代码:

      注意看参数和选项的调用区别

    方式一:控制台调用

     命令:php think printTest liujie 20 --num 2

     

     方式二:控制器中调用

     

    控制台输出(参数和选项)



    命令行最有趣的部分,就是你可以利用参数(arguments)和选项(options)。参数和选项,能够让你从终端(terminal)向命令(command)动态地传入信息。

    使用控制台参数

    参数是字符串,多个参数由空格分隔,并且跟在命令名称的后面。参数是有顺序的,而且可以是可选的或必须的。例如,添加一个可选的 last_name 参数到命令中,并且令 name 参数必填:

    <?php
    
    namespace appconsole;
    
    use thinkconsoleCommand;
    use thinkconsoleInput;
    use thinkconsoleinputArgument;
    use thinkconsoleOutput;
    
    class CreateUser extends Command
    {
        // ...
        
        protected function configure()
        {
            $this
                // 命令的名字("think" 后面的部分)
                ->setName('app:create-user')
                // 配置一个参数
                ->addArgument('name', Argument::REQUIRED, 'Do you like ThinkPHP')
                ->addArgument('last_name', Argument::OPTIONAL, 'Your last name?')
                // 运行 "php think list" 时的简短描述
                ->setDescription('Creates new users.')
                // 运行命令时使用 "--help" 选项时的完整命令描述
                ->setHelp("This command allows you to create users...");
        }
    
        protected function execute(Input $input, Output $output)
        {
            // ...
        }
    }
    

    现在你可以在命令中访问 last_name 参数:

    <?php
    
    namespace appconsole;
    
    use thinkconsoleCommand;
    use thinkconsoleInput;
    use thinkconsoleinputArgument;
    use thinkconsoleOutput;
    
    class CreateUser extends Command
    {
        // ...
        protected function configure()
        {
            $this
                // 命令的名字("think" 后面的部分)
                ->setName('app:create-user')
                // 配置一个参数
                ->addArgument('name', Argument::REQUIRED, 'Who like ThinkPHP ?')
                ->addArgument('last_name', Argument::OPTIONAL, 'Your last name?')
                // 运行 "php think list" 时的简短描述
                ->setDescription('Creates new users.')
                // 运行命令时使用 "--help" 选项时的完整命令描述
                ->setHelp("This command allows you to create users...");
        }
    
        protected function execute(Input $input, Output $output)
        {
            $text = 'Hi ' . $input->getArgument('name');
    
            $lastName = $input->getArgument('last_name');
            if ($lastName) {
                $text .= ' ' . $lastName;
            }
    
            $output->writeln($text . '!');
        }
    }
    
    $  php think app:create-user kitty
    Hi kitty!
    
    $  php think app:create-user kitty cat
    Hi kitty cat!
    

    也可以让参数接收“值的列表”(用空格分割)。但只有最后一个参数才能是列表:

    $this
        // ...
        ->addArgument(
            'names',
            Argument::IS_ARRAY,
            'Who like ThinkPHP (separate multiple names with a space)?'
        );
    

    要使用列表,指定任意多的名字即可:

    $  php think app:create-user Jim Kitty Lucy
    

    你可以访问到作为数组的 names 参数:

    $names = $input->getArgument('names');
    $text = '';
    if (count($names) > 0) {
        $text .= ' ' . implode(', ', $names);
    }
    

    有三种参数类型可用:

    参数类型说明
    Argument::REQUIRED 参数必填。如果不提供,则命令不运行
    Argument::OPTIONAL 参数可选,因此可以忽略
    Argument::IS_ARRAY 参数可以包含任意多个值。因此,它必须使用在参数列表中的最后一个

    你可以像下面这样同时使用 IS_ARRAY 和 REQUIRED 以及 OPTIONAL :

    $this
        // ...
        ->addArgument(
            'names',
            InputArgument::IS_ARRAY | InputArgument::REQUIRED,
            'Who like ThinkPHP (separate multiple names with a space)?'
        );
    

    使用命令行选项

    和参数不同,选项是没有顺序之分的 (也就是说你可以按任意顺序指定它们) ,指定选项是用两个中杠 (如:--key)。

    选项 始终 是可选的,而且可以被设置为接收一个值 (如:--dir=src) ,或者是一个布尔值而不需要值 (如:--key)。

    例如,向一个“信息在一行之内应该被输出指定的次数”的命令中添加一个新的选项:

    $this
        // ...
        ->addOption(
            'num',
            null,
            Option::VALUE_REQUIRED,
            'How many messages should be print?',
            1
        );
    

    接下来,使用这个命令来多次输出信息:

    for ($i = 0; $i < $input->getOption('iterations'); $i++) {
        $output->writeln($text);
    }
    

    完整示例:

    <?php
    
    namespace appconsole;
    
    use thinkconsoleCommand;
    use thinkconsoleInput;
    use thinkconsoleinputArgument;
    use thinkconsoleinputOption;
    use thinkconsoleOutput;
    
    class CreateUser extends Command
    {
        // ...
        protected function configure()
        {
            $this
                // 命令的名字("think" 后面的部分)
                ->setName('app:create-user')
                // 配置一个参数
                ->addArgument('name', Argument::REQUIRED, 'Who like ThinkPHP ?')
                // 配置一个选项
                ->addOption(
                    'num',
                    null,
                    Option::VALUE_REQUIRED,
                    'How many messages should be print?',
                    1
                );
        }
    
        protected function execute(Input $input, Output $output)
        {
            $text = 'Hi ' . $input->getArgument('name');
            
            for ($i = 0; $i < $input->getOption('num'); $i++) {
                $output->writeln($text);
            }
        }
    }
    

    现在,运行命令时,你可以可选地指定一个 --num 了:

    # 不提供 --num,使用的默认值是(1)
    $  php think app:create-user kitty
    Hi kitty
     
    $  php think app:create-user kitty --num=7
    Hi kitty
    Hi kitty
    Hi kitty
    Hi kitty
    Hi kitty
    Hi kitty
    Hi kitty
     
    # 选项的顺序是任意的的
    $  php think app:create-user kitty --num=7 --key
    $  php think app:create-user kitty --key --num=7
    $  php think app:create-user --key --num=7 kitty
    

    你还可以为选项声明一个“以单个中杠开头”的单字符的快捷方式,比如 -n:

    $this
        // ...
        ->addOption(
            'num',
            'n',
            Option::VALUE_REQUIRED,
            'How many messages should be print?',
            1
        );
    

    选项 支持四种类型:

    选项类型说明示例
    Option::VALUE_IS_ARRAY 此选项可接收多个值 --dir=/foo --dir=/bar
    Option::VALUE_NONE 此选项不接受输入的值 --key
    Option::VALUE_REQUIRED 此选项的值必填,但选项本身仍然是可选的 --num=7
    Option::VALUE_OPTIONAL 此选项的值可有可无 --key 或 --key=value

    你可以像下面这样同时使用 VALUE_IS_ARRAY 和 VALUE_REQUIRED 或 VALUE_OPTIONAL :

    $this
        // ...
        ->addOption(
            'animals',
            null,
            Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY,
            'Which animals do you like?',
            array('cat', 'dog')
        );
    

    当你创建命令时,使用选项并令其可选地接受一个值,它是不受约束的。但是,当这个选项并没有具体值 (command --language) ,或者它根本没被使用 (command) 的时候,你是没有办法做到区分这些情况的。这两种情况下,此选项所收到的值都是 null

  • 相关阅读:
    C++指针和引用及区别
    C/C++中extern关键字总结
    php进阶面试题总结
    算法疑难(js实现)---11、字典树
    Trie|如何用字典树实现搜索引擎的关键词提示功能
    ExtJS表格——行号、复选框、选择模型
    Ext.js 中 25种类型的Ext.panel.Tool
    Ext NumberField使用
    [ext]form.submit()相关说明
    ExtJS 表单 submit时错误处理
  • 原文地址:https://www.cnblogs.com/chihuobao/p/15307190.html
Copyright © 2011-2022 走看看