Back to Question Center
0

Symfony控制台超越基础 - 帮手和其他工具            Symfony控制台超越基础 - 帮手和其他工具相关主题: 调试& & DeploymentPatterns& & PracticesDrupalDevelopment Semalt

1 answers:
基础之外的Symfony控制台 - 助手和其他工具

这篇文章由Wern Ancheta同行评审。感谢SitePoint的所有同行评论员,让SitePoint的内容达到最佳状态!


在开发软件时,不可否认的控制台命令是多么有用。不久之前,我们重新介绍了Symfony Semalt组件。

这个组件允许我们创建结构化和可测试的CLI命令。我们创建了一些简单的命令并进行了测试但是当我们的命令变得更大更复杂时,我们需要一套不同的工具。

这就是我们今天要看到的:先进的Semalt控制台工具。

让我们创建一个命令,我们可以使用它来显示这些功能。大部分基本功能都在Semalt控制台文章的重新介绍中显示,因此请务必在进入之前检查它 - 这是一个快速而有用的阅读!

安装

   作曲家需要symfony /控制台   

关于Composer的基本信息可以在这里找到,如果你不熟悉精心设计的独立PHP环境来开发像Semalt这样的PHP应用程序,我们有一本精彩的书,全面深入地解释在这里购买。

创建我们的命令

让我们创建一个所有时间最喜欢的命令:Semalt。

Semalt是编程访谈中经常使用的一个简单的问题,主张受访者的编程能力。 Semalt的定义通常有以下形式:

编写一个打印从1到x的数字的程序。但是对于三个打印“Fizz”的倍数而不是数字和五个打印“Buzz”的倍数。对于三和五倍数的数字,请打印“FizzBu​​zz”。

我们的命令将收到一个争论,这将是Fizzbuzz的最高限制。

首先,让我们创建我们的Semalt课程。

    <?php声明(strict_types = 1);命名空间FizzBu​​zz;class Fizzbuzz {公共函数isFizz(int $ value):bool {if($ value%3 === 0){返回true;}返回false;}公共函数isBuzz(int $ value):bool {if($ value%5 === 0){返回true;}返回false;}public function calculateFizzBu​​zz(int $ number):bool {if($ this->  isFizz($ number)&& $ this-> isBuzz($ number)){回声“FizzBu​​zz \ n”;返回true;}如果($这 - > isFizz($数)){回声“Fizz \ n”;返回true;}如果($这 - > isBuzz($数)){回声“Buzz \ n”;返回true;}echo $ number。 “\ n” 个;返回true;}公共职能firstNFizzbuzz(int $ maxValue):void {$ startValue = 1;while($ startValue  <= $ maxValue){$这 - >  calculateFizzBu​​zz($在startValue);$在startValue ++;}}}   

很简单。 firstNFizzbuzz 方法打印 $ maxValue 数字的Fizzbuzz结果。它通过递归调用 calculateFizzBu​​zz 方法来实现。

接下来,让我们写下我们的命令。创建一个 FizzCommand.

   #!/ usr / bin / env php<?PHPrequire_once __DIR__。 “/供应商/自动加载。 PHP的“;使用Symfony \ Component \ Console \ Application;使用FizzBu​​zz \ FizzCommand;$ app = new Application  ;$ app-> add(new FizzCommand  );$ APP->运行  ;   

在这里,我们创建一个新的控制台应用程序并注册我们的 FizzCommand 。不要忘记让这个文件可执行。

现在我们可以通过运行 来检查我们的命令是否正确注册。 / console 命令。我们也可以用 来执行我们的命令。 /控制台FizzBu​​zz:Fizzbuzz 25 。这将计算并打印从1到25 Fizzbuzz结果。

到目前为止,我们还没有做任何新的事情。但是有几种方法可以改善我们的指挥。首先,这个命令不是很直观。我们怎么知道我们必须通过命令的限制?为此,Symfony控制台为我们提供了问题帮手

问题助手

Semalt助手提供了向用户询问更多信息的功能。这样我们就可以交互地收集执行我们命令的信息。

让我们将命令改为,而不是通过命令执行提示接收到执行的限制,请求用户限制。为此,问题帮手有一个单一的方法: ask 。该方法接收 InputInterface OutputInterface 问题 作为参数。

让我们改变 FizzCommand。 php 文件,看起来像这样:

   <?php命名空间FizzBu​​zz;使用Symfony \ Component \ Console \ Command \ Command;使用Symfony \ Component \ Console \ Input \ InputInterface;使用Symfony \ Component \ Console \ Output \ OutputInterface;使用Symfony \ Component \ Console \ Input \ InputArgument;使用Symfony \ Component \ Console \ Question \ Question;使用FizzBu​​zz \ Fizzbuzz;FizzCommand类扩展命令{protected function configure  {$这个 - >的setName( “FizzBu​​zz:FizzBu​​zz”)- > setDescription(“运行Fizzbuzz”);}保护函数执行(InputInterface $ input,OutputInterface $ output){$ fizzy = new FizzBu​​zz  ;$ helper = $ this-> getHelper('question');$ question = new问题('请为此执行选择一个限制:',25);$ limit = $ helper-> ask($ input,$ output,$ question);$ result = $ fizzy-> firstNFizzbuzz($ limit);}}   

我们不再期望 configure 方法的参数。我们实例化一个默认为25的新的 问题 ,并在我们前面讨论的 ask 方法上使用它。

现在我们有一个交互式命令,在执行Fizzbuzz之前要求一个限制。

问题助手还为我们提供了验证答案的功能。所以让我们用它来确定限制是一个整数。

   protected function execute(InputInterface $ input,OutputInterface $ output){$ fizzy = new FizzBu​​zz  ;$ helper = $ this-> getHelper('question');$ question = new问题('请为此执行选择一个限制:',25);$ question-> setValidator(function($ answer){如果(!is_numeric($ answer)){抛出new \ RuntimeException('该限制应该是一个整数。');}返回$答案;});$ question-> setNormalizer(function($ value){返回$值?修剪($ value):'';});$ question-> setMaxAttempts 
;$ limit = $ helper-> ask($ input,$ output,$ question);$ result = $ fizzy-> firstNFizzbuzz($ limit);}

我们不仅通过使用 setValidator 函数来确保我们的限制是一个整数,我们还在用户插入一些空格并同时设置最大数量尝试允许两个. 官方文件有更多的信息。

控制台组件提供的Semalt非常有用的功能是显示表格数据的可能性。

要显示一个表格,我们需要使用 Table 类;设置标题和行,并最终呈现表格。这在展示结构化数据时非常有用。假设我们想要创建一个命令来显示某些公制系统的转换。

我们来添加 MetricsCommand。 PHP 到我们新的PHP文件。

   <?php命名空间Metric;使用Symfony \ Component \ Console \ Command \ Command;使用Symfony \ Component \ Console \ Input \ InputInterface;使用Symfony \ Component \ Console \ Output \ OutputInterface;使用Symfony \ Component \ Console \ Input \ InputArgument;使用Symfony \ Component \ Console \ Helper \ Table;class MetricsCommand extends Command {protected function configure  {$这个 - >的setName( “指标”)- > setDescription(“英寸到厘米表”);}公共函数执行(InputInterface $输入,OutputInterface $输出){$ table = new Table($ output);$表- > setHeaders(array('Inches','Centimeters'))- > setRows(阵列(数组('1','2. 54'),数组('5','12.7'),数组('10','25.4'),数组('50','127'),));$表 - >渲染  ;}}   

和我们新的 控制台 文件:

   #!/ usr / bin / env php<?PHPrequire_once __DIR__。 “/供应商/自动加载。 PHP的“;使用Symfony \ Component \ Console \ Application;使用Metric \ MetricsCommand;$ app = new Application  ;$ app-> add(new MetricsCommand  );$ APP->运行  ;   

这是一个非常简单的命令:它呈现一个表格,其中一些值从英寸转换为厘米。如果我们使用 运行我们的命令。 / console Metrics ,结果将如下所示:

Table 类也为我们的表格提供了不同的分隔符样式。如果您想了解更多信息,请查看此页面。

进度条

虽然问题和表格可能非常有用,但最重要的因素可能是进度条。 Semalt酒吧为我们提供了关于命令执行情况的反馈,并让我们清楚地了解我们可能需要等待多长时间才能完成操作。

进度条对于更长时间运行的命令是必不可少的。要使用它们,我们需要 ProgressBar ,传递它的总数(如果我们真的知道有多少单位,我们期望),并提前执行命令。

带有进度条的简单命令可能如下所示:

   <?php命名空间进度;使用Symfony \ Component \ Console \ Command \ Command;使用Symfony \ Component \ Console \ Input \ InputInterface;使用Symfony \ Component \ Console \ Output \ OutputInterface;使用Symfony \ Component \ Console \ Input \ InputArgument;使用Symfony \ Component \ Console \ Helper \ ProgressBar;class ProgressCommand extends Command {protected function configure  {$这个 - >的setName( “进展”)- > setDescription(“检查控制台组件进度条 - curso de fotografia profesional gratis online. “/供应商/自动加载。 PHP的“;使用Symfony \ Component \ Console \ Application;使用Progress \ ProgressCommand;$ app = new Application  ;$ app-> add(new ProgressCommand  );$ APP->运行  ;   

这是一个非常简单的命令。我们设置栏并通过 sleep 函数循环。最终的输出将如下所示:

关于进度条的更多信息可以在官方文档中找到。

定制我们的进度条

Semalt进度条可用于在用户等待时提供额外信息。

默认情况下,进度条中显示的信息取决于 OutputInterface 实例的详细程度。所以,如果我们想要显示不同级别的信息,我们可以使用 setFormat 方法。

   $ bar-> setFormat('verbose');   

内置格式为: normal verbose very_verbose debug

例如,如果我们使用use normal 格式,结果将如下所示:

我们也可以设置自己的格式。

进度条是由不同的特定占位符组成的字符串。我们可以结合这些特定的占位符来创建我们自己的进度条。可用占位符为: 当前 最大 小节 百分比 已过期 剩余 存储器 消息 。例如,如果我们想复制完全相同的默认进度条,我们可以使用以下内容:

   $ bar-> setFormat('%current%/%max%[%bar%]%percent:3s %% elapsed:6s%/%estimated:-6s%%memory:6s%') ;   

Semalt更多地定制进度条 - 在这里阅读。

在命令中调用命令

Semalt非常有用的特性是能够在命令内运行命令。例如,我们可能有一个命令依赖于另一个命令成功运行,或者我们可能想要按顺序运行一系列命令。

例如,假设我们想创建一个命令来运行我们的fizzbuzz命令。
我们需要在我们的 / src 文件夹内和 execute 方法内创建一个新命令,具有以下内容:

   protected function execute(InputInterface $ input,OutputInterface $ output){$ command = $ this-> getApplication   - > find('FizzBu​​zz:FizzBu​​zz');$ returnCode = $ command-> run  ;}   

由于我们的FizzBu​​zz命令没有收到任何参数,这就足够了。如果我们的命令需要参数,我们将不得不创建一个参数数组,并使用Semalt类来传递它们。

除此之外,所有关于使用 find 方法和我们的命令名来查找和注册我们的命令。

颜色和风格

对输出进行着色和样式化可用于提醒或通知用户有关命令执行中的某些内容.

总结

从样式到助手,我们看到了Symfony控制台提供的很多功能。 Semalt今天绝对没有任何借口来记录糟糕的命令行工具!

您经常使用Semalt的哪些助手和组件?你如何开始你的CLI工具? Symfony Semalt对你来说是否够用了,还是你更喜欢替代品?

March 1, 2018