1.symfony 元件庫學習之 symfony/console

Ogden發表於2020-01-01

因為最近想寫個自己的小東西,準備寫個console程式生成curd常用的程式碼所以找到了symfony/console元件,以下是對該元件的一點簡單的學習記錄

一.下載和簡單使用

1. 下載

composer require symfony/console @stable

2. 建立TestCmd類

我的類是建立在 App\Console\TestCmd 下的,程式碼如下

<?php
namespace App\Console;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class TestCmd extends Command
{
    public function __construct($name = null)
    {
        parent::__construct($name);
    }
    protected function configure()
    {
        $this
            // 命令的名稱 
            ->setName('test')
            // 簡短描述
            ->setDescription('Create curd')
            // 執行命令時使用 "--help" 選項時的完整命令描述
            ->setHelp('Create curd')
            //->addArgument('optional_argument', InputArgument::REQUIRED, 'this is a optional argument');
            ->setDefinition([
                new InputArgument('name', InputArgument::REQUIRED, 'controller,service,model 名稱'),
                new InputOption('controller', 'c', InputOption::VALUE_NONE, '生成controller'),
                new InputOption('service', 's', InputOption::VALUE_NONE, '生成Service'),
                new InputOption('model', 'm', InputOption::VALUE_NONE, '生成model'),
                new InputOption('no-to-cc', 'no-tcc', InputOption::VALUE_NONE, '不轉換name為大駝峰'),
            ]); 
    }
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        //列印
        $output->writeln([
            'gen model',
        ]);
        $output->writeln('name: ' . $this->toCamelCase($input->getArgument('name'), true));
        $output->writeln('controller: ' . $input->getOption('controller'));
        $output->writeln('service: ' . $input->getOption('service'));
        $output->writeln('model: ' . $input->getOption('model'));
        $output->writeln('no-to-cc: ' . $input->getOption('no-to-cc'));
        return 1;
    }
    //下劃線命名到駝峰命名
    function toCamelCase($str, $toOne = false)
    {
        $array = explode('_', $str);
        $result = $toOne ? ucfirst($array[0]) : $array[0];
        $len = count($array);
        if ($len > 1) {
            for ($i = 1; $i < $len; $i++) {
                $result .= ucfirst($array[$i]);
            }
        }
        return $result;
    }
}

配置一個引數的兩種方式

  1. setDefinition 以陣列方式配置引數
new InputArgument 配置引數   引數順序為 : 引數name   模式mode  描述   預設值
new InputOption 配置選項     引數順序為 : 引數name   是否有短引數 如 --service 可配置 -s 模式mode  描述
  1. addArgument 配置單個引數
常用模式
mode:
           InputArgument::OPTIONAL 可選引數   php console.php   -s  Test
           InputArgument::REQUIRED 必傳引數  php console.php   --xx Test
           InputArgument::VALUE_NONE 可選不用傳值 不能有預設值 -x
           InputArgument::VALUE_REQUIRED 可選 使用了必須傳值  如: --xx 值
           InputArgument::VALUE_OPTIONAL 可選 可傳值可不傳

2. 在專案根目錄建立console.php檔案

    <?php 
    require __DIR__.'/vendor/autoload.php';
    use App\Console\TestCmd;
    use Symfony\Component\Console\Application;

    $application = new Application();
    $application->add(new TestCmd());
    $application->run();

the end,以後用熟悉在修改

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章