用 symfony/console 元件寫命令列指令碼

jerrkill發表於2019-01-21

php artisan model:create User 這條命令你一定很熟悉。
下面我們就來實現類似的命令。

首先要明白 symfony/console 是什麼?
它是 symfony 裡面的一個控制檯命令元件,更優秀的事 symfony 的元件各自都保持獨立,不需要其他依賴。這就意味著我們可以在任意我們想要的地方去使用。

  1. composer 安裝 symfony/console 元件。
  2. 按照規範編寫 console 應用程式(等於 artisan )。
  3. 按照規範編寫 commands (命令)。
  4. 大功告成。

composer require symfony/console

console_command檔案

#!/usr/bin/env php
<?php

require __DIR__.'/vendor/autoload.php';

use Symfony\Component\Console\Application;
use Cmd\ModelCommand;

$application = new Application();

// 註冊我們編寫的命令 (commands)
$application->add(new ModelCommand());

$application->run();

這裡需要注意自動載入問題!

 "autoload": {
       "psr-4":{
           "Cmd\\": "Cmd"
       }

上面一段加入到 composer.json 中。下面是我的最終檔案內容

{
    "require": {
        "symfony/console": "^4.2"
    },
    "autoload": {
       "psr-4":{
           "Cmd\\": "Cmd"
       }
   }
}

ModelCommand.php

<?php
namespace Cmd;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;

class ModelCommand extends Command
{
    protected function configure()
    {
        $this
            // 命令的名稱 ("php console_command" 後面的部分)
            ->setName('model:create')
            // 執行 "php console_command list" 時的簡短描述
            ->setDescription('Create new model')
            // 執行命令時使用 "--help" 選項時的完整命令描述
            ->setHelp('This command allow you to create models...')
            // 配置一個引數
            ->addArgument('name', InputArgument::REQUIRED, 'what\'s model you want to create ?')
            // 配置一個可選引數
            ->addArgument('optional_argument', InputArgument::OPTIONAL, 'this is a optional argument');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // 你想要做的任何操作
        $optional_argument = $input->getArgument('optional_argument');

        $output->writeln('creating...');
        $output->writeln('created ' . $input->getArgument('name') . ' model success !');

        if ($optional_argument)
            $output->writeln('optional argument is ' . $optional_argument);

        $output->writeln('the end.');
    }
}

file

高度自律,深度思考,以勤補拙

相關文章