超越基础知识的符号控制台 - 助手和其他工具
钥匙要点
- symfony控制台组件允许开发人员创建结构化和可测试的CLI命令,为命令变得更加复杂提供了各种工具。
> SYMFONY控制台中的问题助手可用于交互式收集命令执行的信息,确保用户输入有效并符合某些条件。
Symfony Console提供了通过表类显示表格数据的能力,这对于显示结构化数据很有用。
- >使用Symfony Console,可以实现进度条,以提供有关执行命令的反馈,并估算操作将花费多长时间。 Symfony控制台组件允许通过着色和样式自定义命令行工具输出,甚至允许使用OutputFormatterStyle类创建自定义样式。
- 本文由Wern Ancheta进行了同行评审。感谢SitePoint所有的同行评审员制作SitePoint内容的最佳状态!
- >不可否认的是,开发软件时的控制台命令有多么有用。不久前,我们重新引入了Symfony Console组件。 >
> 这是我们今天要看的:高级Symfony Console Tools。 >让我们创建一个命令,可以用来显示其中一些功能。大多数基本功能都在对Symfony Console文章的重新引入中显示,因此请务必在进行前进之前检查一下 - 这是一个快速但有用的阅读!
>
>安装
在这里可以找到有关作曲家的基本信息,如果您不熟悉设计良好的孤立的PHP环境,可以在其中开发诸如Vagrant之类的PHP应用程序,我们有一本很棒的书,可以深入地解释所有内容在这里购买。
创建我们的命令
>让我们创建一个最喜欢的命令:fizzbuzz。
>
<span>composer require symfony/console </span>
编写一个从1到x打印数字的程序。但是,对于三个打印“ Fizz”的倍数,而不是数字和倍数的倍数。对于三个和五个倍数的数字,打印“ fizzbuzz”。 我们的命令将收到一个参数,这将是fizzbuzz的最高限制。
>首先,让我们创建我们的fizzbuzz课程。
><span>composer require symfony/console </span>
>非常简单。 FirstNFizzBuzz()方法将FizzBuzz的结果打印出数字的$ MaxValue。它通过递归调用CounculateFizzBuzz()方法来做到这一点。
>接下来,让我们写下我们的命令。创建一个带有以下内容的FizzCommand.php文件:
><span><span><?php </span></span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>class Fizzbuzz{ </span></span><span> </span><span> <span>public function isFizz(int $value): bool{ </span></span><span> <span>if($value % 3 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function isBuzz(int $value): bool{ </span></span><span> <span>if($value % 5 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function calculateFizzBuzz(int $number): bool{ </span></span><span> <span>if($this->isFizz($number) && $this->isBuzz($number)){ </span></span><span> <span>echo "FizzBuzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isFizz($number)){ </span></span><span> <span>echo "Fizz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isBuzz($number)){ </span></span><span> <span>echo "Buzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>echo $number . "\n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> </span><span> <span>public function firstNFizzbuzz(int $maxValue): void{ </span></span><span> <span>$startValue = 1; </span></span><span> </span><span> <span>while($startValue <= $maxValue){ </span></span><span> <span>$this->calculateFizzBuzz($startValue); </span></span><span> <span>$startValue++; </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>} </span></span>
>最后我们的控制台文件。
<span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz") </span></span><span> <span>->addArgument('Limit', InputArgument<span>::</span>REQUIRED, 'What is the limit you wish for Fizzbuzz?'); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> <span>$input = $input->getArgument('Limit'); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($input); </span></span><span> <span>} </span></span><span> </span><span><span>} </span></span>
在这里,我们创建一个新的控制台应用程序,然后将我们的fizzCommand()注册到其中。不要忘记使此文件可执行。
>现在,我们可以通过运行./console命令来检查我们的命令是否正确注册。我们还可以使用./console fizzbuzz:fizzbuzz 25执行命令。这将计算并打印1至25的fizzbuzz结果。
> 到目前为止,我们还没有做任何新的事情。但是有几种方法可以提高命令。首先,命令不是很直观。我们怎么知道我们必须将限制传递给命令?为此,Symfony控制台为我们提供了一个问题。问题助手
helper提供的问题提供了询问用户更多信息的功能。这样,我们可以交互收集信息以执行我们的命令。
>
>让我们将命令更改为,而不是通过命令执行提示符接收执行限制,而是向用户询问限制。为此,助手的问题有一个方法:ask()。此方法作为参数输入接口,输出接口和问题。>
>让我们更改fizzcommand.php文件,这样看起来像这样:>
#!/usr/bin/env php <span><span><?php </span></span><span> </span><span><span>require_once __DIR__ . '/vendor/autoload.php'; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Application</span>; </span></span><span><span>use FizzBuzz<span>\FizzCommand</span>; </span></span><span> </span><span><span>$app = new Application(); </span></span><span><span>$app->add(new FizzCommand()); </span></span><span><span>$app->run(); </span></span>
现在,我们有一个交互式命令,该命令在执行FizzBuzz之前要求限制。
助手的问题还为我们提供了验证答案的功能。因此,让我们使用它来确保极限是整数。
>
<span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span><span>use Symfony<span>\Component\Console\Question\Question</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz"); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> </span><span> <span>$helper = $this->getHelper('question'); </span></span><span> <span>$question = new Question('Please select a limit for this execution: ', 25); </span></span><span> <span>$limit = $helper->ask($input, $output, $question); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($limit); </span></span><span> <span>} </span></span><span><span>} </span></span>
Helper提供的问题提供了更多功能,例如让用户从答案列表中选择,多个答案,隐藏用户答案和自动完成。官方文档有更多有关此的信息。
>表
控制台组件提供的另一个非常有用的功能是显示表格数据的可能性。
要显示一个表,我们需要使用表类;设置标题和行,最后渲染桌子。在显示结构化数据时,这可能非常有用。让我们想象我们要创建一个命令来显示某些公制系统的转换。>让我们将MetricsCommand.php添加到我们的新php文件中。
和我们的新控制台文件:
<span>composer require symfony/console </span>
>这是一个非常简单的命令:它呈现一个表,其中一些值从英寸转换为厘米。如果我们使用./console指标运行命令,则结果将是这样的:
>
>表类还为我们提供了不同的分离器样式。如果您想了解更多信息,请检查此页面。 。
进度栏
>问题和表非常有用,但最重要的要素可能是进度栏。进度条向我们提供有关执行命令的反馈,并让我们清楚地了解我们可能需要等待操作才能完成的时间。
>>进度条对于更长的运行命令至关重要。要使用它们,我们需要进度键,将其传递给总数的总数(如果我们实际知道我们期望多少个单位)并在命令执行时将其推进。
一个带有进度栏的简单命令看起来像这样:
><span><span><?php </span></span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>class Fizzbuzz{ </span></span><span> </span><span> <span>public function isFizz(int $value): bool{ </span></span><span> <span>if($value % 3 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function isBuzz(int $value): bool{ </span></span><span> <span>if($value % 5 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function calculateFizzBuzz(int $number): bool{ </span></span><span> <span>if($this->isFizz($number) && $this->isBuzz($number)){ </span></span><span> <span>echo "FizzBuzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isFizz($number)){ </span></span><span> <span>echo "Fizz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isBuzz($number)){ </span></span><span> <span>echo "Buzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>echo $number . "\n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> </span><span> <span>public function firstNFizzbuzz(int $maxValue): void{ </span></span><span> <span>$startValue = 1; </span></span><span> </span><span> <span>while($startValue <= $maxValue){ </span></span><span> <span>$this->calculateFizzBuzz($startValue); </span></span><span> <span>$startValue++; </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>} </span></span>
和各自的控制台:
<span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz") </span></span><span> <span>->addArgument('Limit', InputArgument<span>::</span>REQUIRED, 'What is the limit you wish for Fizzbuzz?'); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> <span>$input = $input->getArgument('Limit'); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($input); </span></span><span> <span>} </span></span><span> </span><span><span>} </span></span>
这个非常简单的命令。我们通过睡眠()函数设置了栏和循环。最终输出将看起来像:
可以在官方文档中找到有关进度条的更多信息。
>自定义我们的进度栏
>自定义进度栏对于用户等待时提供额外信息可能很有用。
默认情况下,进度条中显示的信息取决于输出接口实例的冗长级别。因此,如果我们想显示不同级别的信息,我们可以使用setFormat()方法。内置格式是:正常,冗长,umey_verbose和debug。
#!/usr/bin/env php <span><span><?php </span></span><span> </span><span><span>require_once __DIR__ . '/vendor/autoload.php'; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Application</span>; </span></span><span><span>use FizzBuzz<span>\FizzCommand</span>; </span></span><span> </span><span><span>$app = new Application(); </span></span><span><span>$app->add(new FizzCommand()); </span></span><span><span>$app->run(); </span></span>
例如,如果我们使用普通格式,则结果将如下所示:
>
我们还可以设置自己的格式。
>进度栏是由不同特定占位符组成的字符串。我们可以将这些特定的占位持有人结合起来,以创建自己的进度栏。可用的占位符为:当前,最大,栏,百分比,经过,剩余,估计,内存和消息。因此,例如,如果我们想复制完全相同的默认进度栏,我们可以使用以下内容:
>自定义进度条还有更多的内容 - 在此处阅读有关。
><span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span><span>use Symfony<span>\Component\Console\Question\Question</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz"); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> </span><span> <span>$helper = $this->getHelper('question'); </span></span><span> <span>$question = new Question('Please select a limit for this execution: ', 25); </span></span><span> <span>$limit = $helper->ask($input, $output, $question); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($limit); </span></span><span> <span>} </span></span><span><span>} </span></span>
>具有另一个非常有用的功能是能够在命令中运行命令。例如,我们可能有一个命令,该命令取决于另一个命令成功运行的命令,或者我们可能希望以序列运行的一系列命令。
> 例如,想象一下,想象我们想创建一个命令来运行我们的fizzbuzz命令。 我们需要在 /src文件夹和execute()方法内创建一个新命令,请具有以下内容:
><span>composer require symfony/console </span>
>由于我们的fizzbuzz命令没有收到任何论点,这就是足够的。如果我们的命令需要参数,我们将不得不创建一系列参数,并使用arrayInput类通过它们。
除此之外颜色和样式
>着色和样式输出对于向用户提醒或通知用户的执行中的某些内容很有用。为此,我们只需要在Writeln()方法中添加以下标签,就像以下内容:
>也可以选择使用outputformatterstyle类来定义我们自己的样式:
<span><span><?php </span></span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>class Fizzbuzz{ </span></span><span> </span><span> <span>public function isFizz(int $value): bool{ </span></span><span> <span>if($value % 3 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function isBuzz(int $value): bool{ </span></span><span> <span>if($value % 5 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function calculateFizzBuzz(int $number): bool{ </span></span><span> <span>if($this->isFizz($number) && $this->isBuzz($number)){ </span></span><span> <span>echo "FizzBuzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isFizz($number)){ </span></span><span> <span>echo "Fizz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isBuzz($number)){ </span></span><span> <span>echo "Buzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>echo $number . "\n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> </span><span> <span>public function firstNFizzbuzz(int $maxValue): void{ </span></span><span> <span>$startValue = 1; </span></span><span> </span><span> <span>while($startValue <= $maxValue){ </span></span><span> <span>$this->calculateFizzBuzz($startValue); </span></span><span> <span>$startValue++; </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>} </span></span>
有关造型的更多信息,可以在此处找到输出。
<span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz") </span></span><span> <span>->addArgument('Limit', InputArgument<span>::</span>REQUIRED, 'What is the limit you wish for Fizzbuzz?'); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> <span>$input = $input->getArgument('Limit'); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($input); </span></span><span> <span>} </span></span><span> </span><span><span>} </span></span>
总结
从样式到助手,我们看到了Symfony控制台开箱即用的许多功能。今天之后,绝对没有任何借口可以记录下来的命令行工具!
>您经常使用哪些助手和组件?您如何启动CLI工具? Symfony控制台是否足够适合您,还是您更喜欢替代方案?
经常询问有关Symfony Console的问题(常见问题解答)Symfony控制台和其他PHP控制台应用程序之间的关键差异是什么? Symfony Console是Symfony PHP框架的组成部分,它提供了一种创建命令行界面(CLI)的方法。与其他PHP控制台应用程序不同,Symfony Console为构建CLI应用程序提供了一种结构化和面向对象的方法。它提供了一组类来定义命令,处理输入和输出并管理应用程序的生命周期。此外,Symfony控制台支持颜色格式,进度条,表格和其他高级控制台功能,这些功能在其他PHP控制台应用程序中未常见。
如何在Symfony Console中创建自定义命令?在Symfony控制台中创建自定义命令涉及扩展命令类并实现configure()和execute()方法。 configure()方法用于定义命令名称,参数和选项,而execute()方法包含命令的逻辑。创建命令类后,可以使用add()方法添加到应用输出接口以处理命令中的输入和输出。 InputInterface提供了获取命令参数和选项的方法,而输出接口提供了写入控制台的方法。您还可以使用InputArgument和InputOption类来定义命令参数和选项。
>>我如何在Symfony控制台中使用助手? SYMFONY控制台提供指挥所类测试命令。 CommandTester类允许您执行具有特定输入的命令并捕获输出。然后,您可以在输出上做出断言以验证命令的行为。
如何处理Symfony控制台中的错误?
>
>我如何在Symfony Framework之外使用Symfony Console组件?>
>如何创建具有多个命令的控制台应用程序?以使用多个命令创建控制台应用程序,您可以在应用程序中添加多个命令类。每个命令类应扩展命令类,并实现configure()和execute()方法。然后,您可以使用应用程序的add()方法添加命令。
>
>如何使用Symfony Console组件来自动化任务?> Symfony Console Component可以用于自动化通过创建执行特定任务并从命令行或脚本运行这些命令的命令来完成任务。您还可以使用诸如cron之类的任务调度程序安排命令以特定的间隔运行。
>以上是超越基础知识的符号控制台 - 助手和其他工具的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
