核心要点
这篇文章于2017年5月24日更新,提供了对这个重要现代工具的更全面的介绍。
"控制台组件简化了创建美观且可测试的命令行界面的过程。"
这是我们访问Symfony Console组件工具页面时看到的欢迎语。
作为软件开发人员,我们经常需要使用命令行工具。当我们需要执行某种重复性任务(如迁移数据、执行导入或创建cron作业)时,这些工具非常有用。
Symfony Console组件工具为我们提供了一个简单的框架来创建我们自己的命令行工具。
与Symfony中的许多组件不同,这是一个独立的包,被Laravel的Artisan以及许多其他著名的PHP包使用。
要了解Symfony Console的替代方案,请参阅我们的比较文章:PHP控制台之战!
安装
composer require symfony/console
此处包含Composer的重要信息。
创建新命令
要创建新命令,我们需要确保我们的文件可执行。为此,让我们在项目根目录中创建一个控制台文件。此文件将作为我们的命令管理器。
touch console
现在,让我们确保该文件可执行。
chmod 755 console
然后,让我们确保我们的文件开头有shebang。shebang是一个字符序列(井号后跟感叹号),出现在脚本的开头。当存在shebang时,exec()将改为运行shebang后指定的可执行文件。在我们的例子中,它将作为PHP脚本运行。
之后,让我们定义我们的控制台应用程序。我们的命令管理器的第一个迭代将如下所示:
#!/usr/bin/env php <?php require_once __DIR__ . '/vendor/autoload.php'; use Symfony\Component\Console\Application; $app = new Application(); $app->run();
让我们仔细看看。首先,我们自动加载所有依赖项,然后从Console组件导入Application包。之后,我们创建一个Application的新实例并运行它。
如果我们使用./console
执行脚本,我们应该得到以下帮助消息:
这是因为我们还没有注册任何命令,我们只是构建了它们的的基本框架。
让我们创建我们的脚本并在我们新创建的命令管理器中注册它。
对于这个具体的例子,我们将实现两个简单的命令:一个用于哈希字符串,另一个用于确认哈希属于给定的字符串。
我们将在其中放置我们的Hash.php类的/src
文件夹中,内容如下:
composer require symfony/console
现在是创建我们的命令的时候了。让我们创建一个名为HashCommand.php的新PHP文件。
这个类将扩展Symfony的Command类并实现configure和execute方法。这些方法对于我们的命令至关重要,因为它们告诉命令如何外观和行为。
完成的命令如下所示:
touch console
在configure部分,setName方法是我们调用命令的方式,setDescription是命令的描述,addArgument是我们声明命令将接受一个名为Password的参数,并且它是必需的。
在execute部分,我们通过getArgument函数访问参数,然后使用我们的Hash类对其进行哈希处理。最后,我们使用OutputInterface的writeln方法将结果打印到屏幕上。
如果我们像这样运行我们的命令,我们将看到什么也没有发生。这是因为我们仍然缺少一个非常重要的步骤。我们仍然需要在控制台中注册我们的命令。
chmod 755 console
在控制台中注册了命令后,让我们运行它。
如果我们再次运行./console
命令,我们可以看到我们现在注册了一个新命令。
让我们运行它:
#!/usr/bin/env php <?php require_once __DIR__ . '/vendor/autoload.php'; use Symfony\Component\Console\Application; $app = new Application(); $app->run();
我们看到最终结果:
哈希值是将PHP hash()方法应用于Sitepoint字符串的结果。
对于哈希确认功能,我们将使用相同的方法,但我们将有两个参数,而不是一个。一个将是需要确认的字符串,另一个是我们想要验证的哈希值。
我们将创建一个新的命令文件,就在HashCommand文件的旁边。让我们称之为ConfirmCommand。
<?php namespace Hash; class Hash { /** * 接收一个字符串密码并对其进行哈希处理。 * * @param string $password * @return string $hash */ public static function hash($password) { return password_hash($password, PASSWORD_DEFAULT); } /** * 验证哈希是否与给定的密码相对应 * * @param string $password * @param string $hash * @return boolean 如果哈希是从密码生成的 */ public static function checkHash($string, $hash) { if (password_verify($string, $hash)) { return true; } return false; } }
然后,在控制台中注册该命令。
<?php namespace Hash; 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; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Hash\Hash; class HashCommand extends Command { protected function configure() { $this->setName("Hash:Hash") ->setDescription("使用Bcrypt对给定字符串进行哈希处理。") ->addArgument('Password', InputArgument::REQUIRED, '你想要哈希什么?'); } protected function execute(InputInterface $input, OutputInterface $output) { $hash = new Hash(); $input = $input->getArgument('Password'); $result = $hash->hash($input); $output->writeln('你的密码哈希值:' . $result); } }
测试
在测试方面,Symfony为我们提供了一些方便的工具。其中最有用的是CommandTester类,因为它提供特殊的输入和输出类来测试我们的命令,而无需命令行。
让我们使用CommandTester类为我们的Hash:Hash命令实现一个测试。
首先,让我们在与我们的/src
文件夹相同的级别创建一个/tests
文件夹。
然后,让我们在其中创建我们的测试类,并将其命名为HashCommandTest.php:
composer require symfony/console
我们首先使用Application类加载我们的命令。然后,我们实例化一个新的CommandTester。使用CommandTester,我们可以配置我们想要如何调用我们的命令。最后一步只是使用getDisplay()方法将执行结果与我们期望的结果进行比较。
getDisplay()方法保存我们命令执行的结果,就像我们在命令行中看到的那样。
结论
我们刚刚使用Symfony Console组件创建了两个不同的命令。我们还看到了测试这些命令的好方法。我建议您查看组件的各种选项和功能,并在下面的评论部分给我们一些关于您实验的反馈。
您想在SitePoint上看到更多关于Symfony Console的高级教程吗?请告诉我们!
我们在本文中编写的全部代码都可以在Github上找到。
Symfony Console是Symfony框架的一个组件,可以使用Composer(PHP中的依赖项管理工具)安装。要安装Symfony Console,您需要在终端中运行以下命令:composer require symfony/console
。此命令将下载并将Symfony Console组件安装到您的项目中。
Symfony Console提供了一个简单的API来创建命令行命令。这些命令可用于cron作业、迁移、导入或任何其他可以通过命令行运行的任务类型。它还支持输出的彩色显示、进度条、表格和其他交互式功能。
要创建新命令,您需要创建一个新类,该类扩展SymfonyComponentConsoleCommandCommand类。在此类中,您在configure方法中定义命令的名称、描述、参数和选项。execute方法包含命令的逻辑。
要运行命令,您需要使用bin/console
脚本,后跟命令的名称。例如,如果您有一个名为app:my-command
的命令,您可以使用以下命令运行它:bin/console app:my-command
。
Symfony Console可以与Doctrine(Symfony中的数据库抽象层)结合使用来管理数据库迁移。您可以创建一个新命令,该命令执行必要的SQL查询来迁移您的数据库。
可以在命令类的configure方法中定义命令参数和选项。您可以使用getArgument和getOption方法在execute方法中检索这些参数和选项的值。
Symfony Console提供了几种显示输出的方法。您可以使用writeln方法显示一行文本,使用write方法显示文本(末尾没有换行符),以及使用table方法显示表格。
可以通过抛出异常来处理错误。Symfony Console将捕获这些异常并显示错误消息。您还可以使用exit方法停止命令的执行并返回退出代码。
Symfony Console提供了一个CommandTester类,可用于测试命令。您可以使用此类来使用特定参数和选项执行命令,并断言输出和退出代码。
在Symfony项目中,您可以使用bin/console
脚本运行命令。您还可以通过在src/Command
目录中创建一个扩展SymfonyComponentConsoleCommandCommand类的新类来创建您自己的命令。
以上是重新引入Symfony Console -CLI PHP,用于初学者!的详细内容。更多信息请关注PHP中文网其他相关文章!