> 这是我们今天要看的:高级Symfony Console Tools。 >让我们创建一个命令,可以用来显示其中一些功能。大多数基本功能都在对Symfony Console文章的重新引入中显示,因此请务必在进行前进之前检查一下 - 这是一个快速但有用的阅读!
>
>安装
在这里可以找到有关作曲家的基本信息,如果您不熟悉设计良好的孤立的PHP环境,可以在其中开发诸如Vagrant之类的PHP应用程序,我们有一本很棒的书,可以深入地解释所有内容在这里购买。
创建我们的命令
>让我们创建一个最喜欢的命令:fizzbuzz。
<span>composer require symfony/console </span>
编写一个从1到x打印数字的程序。但是,对于三个打印“ Fizz”的倍数,而不是数字和倍数的倍数。对于三个和五个倍数的数字,打印“ 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控制台为我们提供了一个问题。问题助手
>
>让我们将命令更改为,而不是通过命令执行提示符接收执行限制,而是向用户询问限制。为此,助手的问题有一个方法: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>
>具有另一个非常有用的功能是能够在命令中运行命令。例如,我们可能有一个命令,该命令取决于另一个命令成功运行的命令,或者我们可能希望以序列运行的一系列命令。
<span>composer require symfony/console </span>
>由于我们的fizzbuzz命令没有收到任何论点,这就是足够的。如果我们的命令需要参数,我们将不得不创建一系列参数,并使用arrayInput类通过它们。
除此之外颜色和样式
也可以选择使用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>
总结
您经常使用哪些助手和组件?您如何启动CLI工具? Symfony控制台是否足够适合您,还是您更喜欢替代方案?
经常询问有关Symfony Console的问题(常见问题解答)Symfony控制台和其他PHP控制台应用程序之间的关键差异是什么? Symfony Console是Symfony PHP框架的组成部分,它提供了一种创建命令行界面(CLI)的方法。与其他PHP控制台应用程序不同,Symfony Console为构建CLI应用程序提供了一种结构化和面向对象的方法。它提供了一组类来定义命令,处理输入和输出并管理应用程序的生命周期。此外,Symfony控制台支持颜色格式,进度条,表格和其他高级控制台功能,这些功能在其他PHP控制台应用程序中未常见。
如何处理Symfony控制台中的错误?
以使用多个命令创建控制台应用程序,您可以在应用程序中添加多个命令类。每个命令类应扩展命令类,并实现configure()和execute()方法。然后,您可以使用应用程序的add()方法添加命令。
> Symfony Console Component可以用于自动化通过创建执行特定任务并从命令行或脚本运行这些命令的命令来完成任务。您还可以使用诸如cron之类的任务调度程序安排命令以特定的间隔运行。
>以上是超越基础知识的符号控制台 - 助手和其他工具的详细内容。更多信息请关注PHP中文网其他相关文章!