> 這是我們今天要看的:高級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中文網其他相關文章!