• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何使用Symfony控制台组件创建自定义CLI命令

在本文中,我们将探讨如何使用 symfony 控制台组件在 php 应用程序中创建自定义命令行界面 (CLI) 命令。安装必要的库后,我们将创建一些示例来演示控制台组件的概念。

事实上,这个组件被几个 PHP框架用于开发 CLI 应用程序,一些流行的框架已经在使用这个组件作为起点。

什么是控制台组件?

Symfony 控制台组件允许您在 PHP 应用程序中创建自定义 CLI 命令。如果您曾经使用过Laravel或 Symfony,您可能会知道它们提供的 CLI 工具以简化日常操作,例如:

  • 生成脚手架代码

  • 清除缓存

  • 安装、启用和禁用附加服务

  • 运行数据库迁移

  • 和更多

以 Laravel 为例,它附带了artisan提供大量实用命令的工具,让我们的生活更轻松。您可能会惊讶地发现该artisan工具是建立在 Symfony 控制台组件本身之上的!事实上,有许多框架利用控制台组件来构建它们的命令行工具。

在本文中,我们将探索控制台组件的基础知识,以便您可以在 PHP 应用程序中创建自定义 CLI 命令。首先,我们将继续使用 Composer 安装控制台组件。安装后,我们将构建一些示例用于演示目的。

安装和配置

在本节中,我们将安装必需的控制台组件,以便在您的 PHP 应用程序中创建CLI命令。我假设你已经在你的系统中安装了 Composer——我们需要它来安装 Packagist 提供的 Console 组件。

安装 Composer 后,继续使用以下命令安装控制台组件。

$composer require symfony/console

那应该已经创建了composer.json文件,它应该如下所示:

{
    "require": {
        "symfony/console": "^4.0"
    }
}

让我们将composer.json文件修改为如下所示:

{
    "require": {
        "symfony/console": "^4.0"
    },
    "autoload": {
         "psr-4": {
             "Console\\": "src"
         },
         "classmap": ["src"]
     }
}

由于我们添加了一个新classmap条目,让我们继续通过运行以下命令来更新Composer 自动加载器。

$composer dump -o

现在,您可以使用Console命名空间来自动加载src目录下的类。

你的第一个 HelloWorld 命令

使用控制台组件创建 CLI 命令是一个两步过程。

  • 首先,您需要创建一个控制台应用程序来加载必要的依赖项并注册您的自定义命令。

  • 接下来,您需要为您在控制台应用程序中注册的所有命令创建文件。

创建控制台应用程序

在本节中,我们将继续创建我们的自定义控制台应用程序。

我们的控制台应用程序的建议目录结构如下所示。

|-- bin
|   `-- console
|-- composer.json
|-- composer.lock
|-- src
|   `-- App
|       `-- Commands
|           |-- ClearcacheCommand.php
|           `-- HelloworldCommand.php
`-- vendor

继续并使用以下内容创建主应用程序文件bin/console 。请注意,没有文件扩展名,并且还要确保它也是可执行的,因为我们需要从命令行运行它。

#!/usr/bin/env php
<?php
require_once __DIR__ . '/../vendor/autoload.php';

use Symfony\Component\Console\Application;

$app = new Application();
$app->run();

文件中的第一行#!/usr/bin/env php确保它在 PHP 环境下运行。继续尝试运行它,看看它是如何运行的。

$bin/console
Console Tool

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  help  Displays help for a command
  list  Lists commands

不错!只需几行代码,您就可以随意使用自定义控制台应用程序!但它目前没有做任何有用的事情。在下一节中,我们将了解如何创建自定义命令并将其注册到我们的自定义控制台应用程序中。

创建 Hello World 命令文件

让我们继续创建我们的第一个自定义命令:  HelloworldCommand. 使用以下内容创建src/App/Commands/HelloworldCommand.php文件。

<?php
namespace Console\App\Commands;

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 HelloworldCommand extends Command
{
    protected function configure()
    {
        $this->setName('hello-world')
            ->setDescription('Prints Hello-World!')
            ->setHelp('Demonstration of custom commands created by Symfony Console component.')
            ->addArgument('username', InputArgument::REQUIRED, 'Pass the username.');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln(sprintf('Hello World!, %s', $input->getArgument('username')));
    }
}

在创建自定义命令时,您应该创建两种主要方法: configure和execute.

顾名思义,该configure方法允许您配置命令,以便您可以设置命令名称、命令的简短描述、帮助文本等。如果要在运行命令时传递参数,还可以为命令配置参数。

在上面的示例中,命令名称设置为hello-world. 此外,我们希望将用户名作为第一个参数传递,因此我们使用该addArgument方法对其进行了配置。

另一方面,该execute方法包含命令的应用逻辑。在我们的例子中,我们通过显示Hello World作为命令的输出来保持它非常简单。

在您继续并实际运行此命令之前,您需要将其注册到我们在上一节中创建的控制台应用程序中。让我们快速修改bin/console文件,使其如下所示。

#!/usr/bin/env php
<?php
require_once __DIR__ . '/../vendor/autoload.php';

use Symfony\Component\Console\Application;
use Console\App\Commands\HelloworldCommand;

$app = new Application();
$app->add(new HelloworldCommand());
$app->run();

如您所见,我们使用对象的add方法Application来添加HelloworldCommand命令。让我们快速列出所有可用的命令。

$bin/console list
Console Tool

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  hello-world      Prints Hello-World!
  help             Displays help for a command
  list             Lists commands

正如预期的那样,该hello-world命令出现在可用命令列表中!继续运行它!

$bin/console hello-world tutsplus
Hello World!, tutsplus

这就是您可以设置基本命令的方式!

一个真实的例子——清除缓存命令

在上一节中,我们构建了hello-world命令来演示 Console 组件的概念。在本节中,我们将继续创建一个真实示例,演示如何构建一个命令来清除应用程序中的缓存。

创建清除缓存命令文件

继续创建具有以下内容的src/App/Commands/ClearcacheCommand.php文件。

<?php
namespace Console\App\Commands;

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

class ClearcacheCommand extends Command
{
    protected function configure()
    {
        $this->setName('clear-cache')
            ->setDescription('Clears the application cache.')
            ->setHelp('Allows you to delete the application cache. Pass the --groups parameter to clear caches of specific groups.')
            ->addOption(
                    'groups',
                    'g',
                    InputOption::VALUE_OPTIONAL,
                    'Pass the comma separated group names if you don\'t want to clear all caches.',
                    ''
                );
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Cache is about to cleared...');

        if ($input->getOption('groups'))
        {
            $groups = explode(",", $input->getOption('groups'));

            if (is_array($groups) && count($groups))
            {
                foreach ($groups as $group)
                {
                    $output->writeln(sprintf('%s cache is cleared', $group));
                }
            }
        }
        else
        {
            $output->writeln('All caches are cleared.');
        }

        $output->writeln('Complete.');
    }
}

该configure方法几乎相同,只是我们使用该addOption方法向我们的命令添加了一个选项。因此,您可以使用--groups参数传递组值。

另一方面,该execute方法包含我们命令的应用逻辑。

如果要清除特定组的缓存,则需要将组名与--group参数一起传递。另一方面,--group如果要清除所有缓存,请跳过该参数。您可能已经注意到,我们通过在方法的第三个参数中--group提供值来保持参数可选。InputOption::VALUE_OPTIONALaddOption

使用控制台应用程序注册和测试

在我们继续并实际运行它之前,让我们将命令注册到我们的控制台应用程序中。

#!/usr/bin/env php
<?php
require_once __DIR__ . '/../vendor/autoload.php';

use Symfony\Component\Console\Application;
use Console\App\Commands\HelloworldCommand;
use Console\App\Commands\ClearcacheCommand;

$app = new Application();
$app->add(new HelloworldCommand());
$app->add(new ClearcacheCommand());
$app->run();

现在,继续运行bin/console clear-cache命令以清除所有缓存!

$bin/console clear-cache
Cache is about to cleared...
All caches are cleared.
Complete.

接下来,如果你想清除特定的缓存,你可以尝试这样的事情。

$bin/console clear-cache --groups=group1,group2
Cache is about to cleared...
group1 cache is cleared
group2 cache is cleared
Complete.

当然,您需要实现清除缓存的实际逻辑,但这应该是一个很好的起点。

结论

今天,我们介绍了 Symfony 框架提供的流行组件之一:控制台组件。如果您希望开发自己的 CLI 应用程序,它确实是一个有用的组件,可帮助您轻松执行日常实用程序任务。


文章目录
  • 什么是控制台组件?
  • 安装和配置
  • 你的第一个 HelloWorld 命令
    • 创建控制台应用程序
    • 创建 Hello World 命令文件
  • 一个真实的例子——清除缓存命令
    • 创建清除缓存命令文件
    • 使用控制台应用程序注册和测试
  • 结论