これが私たちが今日見ようとしていることです:高度なSymfonyコンソールツール。 これらの機能のいくつかを表示するために使用できるコマンドを作成しましょう。基本的な機能のほとんどは、Symfony Consoleの記事への再導入に示されていたので、前に必ず確認してください。
インストール
作曲家に関する重要な情報はこちらにあります。VagrantのようなPHPアプリを開発するための適切に設計された孤立したPHP環境に精通していない場合は、利用可能な詳細を説明する素晴らしい本があります。ここで購入します コマンドを作成する
これまでのお気に入りのコマンドを作成しましょう:Fizzbuzz。
Fizzbuzzは、インタビューの能力を主張するために、プログラミングインタビューでよく使用される簡単な問題です。 Fizzbuzzの定義は通常、次の形式になります:
<span>composer require symfony/console </span>
私たちのコマンドは、フィズバズの最上限となる議論を受け取ります。 まず、Fizzbuzzクラスを作成しましょう。
<span>composer require symfony/console </span>
かなり簡単です。 firstnfizzbuzz()メソッドは、数字の$ maxvalueのfizzbuzzの結果を印刷します。これは、calutefizzbuzz()メソッドを再帰的に呼び出すことで行います
次に、コマンドを書きましょう。次の内容を備えた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>
ここでは、新しいコンソールアプリケーションを作成し、FizzCommand()を登録します。このファイルを実行可能にすることを忘れないでください。
<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>
./consoleコマンドを実行することにより、コマンドが正しく登録されているかどうかを確認できます。また、./Console FizzBuzz:FizzBuzz 25でコマンドを実行することもできます。
今まで、私たちは新しいことをしていません。しかし、コマンドを改善する方法はいくつかあります。まず、コマンドはそれほど直感的ではありません。コマンドに制限を渡さなければならないことをどのようにして知ることができますか?そのため、Symfonyコンソールは私たちに質問ヘルパーを提供します。質問ヘルパー
質問ヘルパーは、ユーザーに詳細について尋ねる機能を提供します。このようにして、コマンドの実行のために情報をインタラクティブに収集できます。
コマンドを実行して、コマンドの実行制限を受信する代わりに、コマンドを変更して、ユーザーに制限を尋ねます。そのため、質問ヘルパーには単一の方法があります:ask()。この方法は、入力インターフェイス、出力インターフェイス、質問を引数として受信します。configure()メソッドに関する引数はもはや期待されていません。デフォルトの25の新しい質問をインスタンス化し、以前に説明したAsk()メソッドで使用します。
今では、フィズバズを実行する前に制限を要求するインタラクティブなコマンドがあります。
質問ヘルパーは、回答を検証する機能も提供します。それでは、制限が整数であることを確認するために使用しましょう。
#!/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>
質問ヘルパーは、ユーザーに回答のリスト、複数の回答のリスト、ユーザーの回答の隠し、および自動完了から選択できるように、より多くの機能を提供します。公式のドキュメントにはそれに関する多くの情報があります。
表
コンソールコンポーネントによって提供されるもう1つの非常に有用な機能は、表形式データを表示する可能性です。
テーブルを表示するには、テーブルクラスを使用する必要があります。ヘッダーと行を設定し、最後にテーブルをレンダリングします。これは、構造化されたデータを表示する場合に非常に便利です。一部のメトリックシステムの変換を表示するコマンドを作成したいと想像しましょう。<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>
これは非常に単純なコマンドです。インチからセンチメートルからセンチメートルに変換されたいくつかの値を持つテーブルをレンダリングします。 ./consoleメトリックを使用してコマンドを実行すると、結果は次のようなものになります。
進行中のバー
進行中のバーは、長期にわたるコマンドに不可欠です。それらを使用するには、ProgressBarが必要であり、合計ユニットの数を渡し(実際に期待するユニットの数がわかっている場合)、コマンドが実行されるときにそれを前進させます。
進行状況バーを持つ簡単なコマンドは次のようになるかもしれません:
およびそれぞれのコンソール:
<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>
これは非常に単純なコマンドです。 Sleep()関数を介してバーとループをセットアップします。最終的な出力は次のようになります:
<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>
進行状況バーの詳細については、公式のドキュメントをご覧ください。
進行状況のカスタマイズは、ユーザーが待機している間に追加の情報を提供するのに役立ちます。
組み込み形式は次のとおりです。通常、冗長、very_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>
独自の形式を設定することもできます。
進行状況バーは、異なる特定のプレースホルダーで構成される文字列です。これらの特定のプレースホルダーを組み合わせて、独自の進行状況バーを作成できます。利用可能なプレースホルダーは、現在、最大、バー、パーセント、経過、残り、推定、メモリ、メッセージです。したがって、たとえば、まったく同じデフォルトの進行状況バーをコピーしたい場合は、次のことを使用できます。
進行状況バーをカスタマイズすることにはもっとたくさんあります。ここで読んでください。
コマンド内のコマンドを呼び出します
もう1つの非常に便利な機能は、コマンド内でコマンドを実行する機能です。たとえば、実行するための別のコマンドに依存するコマンド、またはシーケンスで実行したいコマンドの連続がある場合があります。 たとえば、
fizzbuzzコマンドを実行するコマンドを作成したいと想像してください。 /srcフォルダー内およびexecute()メソッド内に新しいコマンドを作成する必要があります。<span>composer require symfony/console </span>
FizzBuzzコマンドは引数を受け取っていないため、それで十分です。私たちのコマンドが引数を必要とした場合に備えて、一連の引数を作成し、ArrayInputクラスを使用してそれらを渡す必要があります。
それ以外は、コマンド名でfind()メソッドを使用して、コマンドを見つけて登録することがすべてです。色とスタイル
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 Consoleはあなたのために十分ですか、それとも代替品が好きですか?
Symfony Consoleは、コマンドラインインターフェイス(CLI)を作成する方法を提供するSymfony PHPフレームワークのコンポーネントです。他のPHPコンソールアプリケーションとは異なり、Symfonyコンソールは、CLIアプリケーションを構築するための構造化されたオブジェクト指向のアプローチを提供します。コマンドを定義し、入力と出力を処理し、アプリケーションのライフサイクルを管理する一連のクラスを提供します。さらに、Symfony Consoleは、他のPHPコンソールアプリケーションでは一般的には見られないカラーフォーマット、進行状況バー、テーブル、その他の高度なコンソール機能をサポートしています。 Symfony Consoleでカスタムコマンドを作成するには、コマンドクラスを拡張し、configure()およびexecute()メソッドを実装します。 configure()メソッドは、コマンド名、引数、およびオプションを定義するために使用され、execute()メソッドにはコマンドのロジックが含まれます。コマンドクラスが作成されたら、add()メソッドを使用してアプリケーションに追加できます。コマンド内の入力と出力を処理する出力インターフェイス。 inputinterfaceは、コマンドの引数とオプションを取得する方法を提供し、outputinterfaceはコンソールに書き込むメソッドを提供します。また、InputArgumentおよびinputoptionクラスを使用して、コマンド引数とオプションを定義することもできます。
以上が基本を超えたSymfonyコンソール - ヘルパーやその他のツールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。