Back to Question Center
0

Symfony Consoleの基本 - ヘルパーとその他のツール            Symfony Consoleの基本 - ヘルパーとその他のツール関連トピック: デバッグと & DeploymentPatterns& & & & 実践ディラール開発Semalt

1 answers:
Symfony Consoleの基本 - ヘルパーとその他のツール

この記事はWern Anchetaによって査読されました。 SitePointのコンテンツを最高にするためのSitePointのピアレビューアのおかげで、これは最高のものです!


ソフトウェアを開発するときにコンソールコマンドがどれほど有用であるかは否定できない。あまりにもずっと前に、私たちはSymfony Semaltコンポーネントを再導入しました。

このコンポーネントを使用すると、構造化されたテスト可能なCLIコマンドを作成できます。いくつかの簡単なコマンドを作成してテストしました。しかし、私たちの命令が大きく複雑になると、異なるツールが必要になります。

これは今日の我々が見ていることです:高度なSemaltコンソールツール。

これらの機能のいくつかを示すために使用できるコマンドを作成しましょう。基本的な機能のほとんどは、Semaltのコンソール記事の再導入で示されていたので、前に確認しておいてください。

Symfony Consoleの基本 - ヘルパーとその他のツールSymfony Consoleの基本 - ヘルパーとその他のツール関連トピック:
デバッグとデプロイメントパターンと実践DrupalDevelopment Semalt

インストール

   コンポーザにはsymfony / consoleが必要です   

Composerに関する重要な情報はここにあります。SemaltのようなPHPアプリケーションを開発するために設計された、孤立したPHP環境に精通していない場合は、ここで購入してください。

コマンドを作成する

好きなすべての時間のためのコマンドを作りましょう:Semalt。

Semaltは、面接者のプログラミング能力を主張するためにインタビューをプログラミングする際によく使用される単純な問題である。 Semaltの定義は、通常、以下の形式で行われる:

1からxまでの数字をプリントするプログラムを書く。しかし、3倍の倍数の「Fizz」ではなく、5倍の倍数の「Buzz」を入力します。 3と5の倍数の数字の場合は、「FizzBu​​zz」を印刷します。

私たちのコマンドはFizzbuzzの上限になる引数を受け取ります。

まず、Semaltクラスを作成しましょう。

    <?php宣言(strict_types = 1);名前空間FizzBu​​zz;クラスFizzbuzz {パブリック関数isFizz(int $ value):bool {if($ value%3 === 0){真を返します。}偽を返します。}パブリック関数isBuzz(int $ value):bool {if($ value%5 === 0){真を返します。}偽を返します。}パブリック関数calculateFizzBu​​zz(int $ number):bool {if($ this->  isFizz($ number)&& $ this-> isBuzz($ number)){エコー "FizzBu​​zz \ n";真を返します。}if($ this-> isFizz($ number)){エコー "Fizz \ n";真を返します。}if($ this-> isBuzz($ number)){エコー "バズ\ n";真を返します。}echo $ number。 "\ n";真を返します。}public function firstNFizzbuzz(int $ maxValue):void {$ startValue = 1;while($ startValue  <= $ maxValue){$ this->  calculateFizzBu​​zz($ startValue);$ startValue ++;}}}   

かなり簡単。 firstNFizzbuzz メソッドは、 $ maxValue の数値に対してFizzbuzzの結果を出力します。これは、 calculateFizzBu​​zz メソッドを再帰的に呼び出すことで行います。

次に、コマンドを書きましょう。 FizzCommandを作成する.

   #!/ usr / bin / env php<?phprequire_once __DIR__。 '/ vendor / autoload。 php ';Symfony \ Component \ Console \ Applicationを使用してください。FizzBu​​zz \ FizzCommandを使用します。$ app =新しいアプリケーション  ;$ app-> add(新しいFizzCommand  );$ app-> run  ;   

ここで、新しいコンソールアプリケーションを作成し、 FizzCommand を登録します。このファイルを実行可能にすることを忘れないでください。

を実行して、コマンドが正しく登録されているかどうかを確認できます。 / console コマンドを使用します。 でコマンドを実行することもできます。 /コンソールFizzBu​​zz:Fizzbuzz 25 。これは、1から25までのFizzbuzzの結果を計算して印刷します。

これまでは、何も新しいことはしていません。しかし、コマンドを改善するにはいくつかの方法があります。まず第一に、コマンドはあまり直感的ではありません。私たちはコマンドに限界を伝えなければならないことをどのようにして知っていますか?そのために、Symfony Consoleは、Questionヘルパーを提供します。

質問ヘルパー

Semaltヘルパーは、ユーザーに詳細情報を求める機能を提供します。このようにして、コマンドを実行するための情報をインタラクティブに収集することができます。

コマンド実行プロンプトで実行制限を受け取る代わりに、ユーザーに制限を求めるようにコマンドを変更してみましょう。そのために、質問ヘルパーには1つのメソッドがあります: 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 extends Command {保護された関数configure  {$ this-> setName( "FizzBu​​zz:FizzBu​​zz")- > setDescription( "Fizzbuzzを実行する");}保護された関数を実行する(InputInterface $ input、OutputInterface $ output){$ fizzy =新しいFizzBu​​zz  ;$ヘルパー= $ this-> getHelper( '質問');$ question = new Question( 'この実行の制限を選択してください:'、25);$ limit = $ helper-> ask($ input、$ output、$ question);$ result = $ fizzy-> firstNFizzbuzz($ limit);}}   

configure メソッドについての引数はもはや予期しません。既定値25の新しい 質問 をインスタンス化し、先ほどお話した ask メソッドで使用します。

Fizzbuzzを実行する前に制限を求めるインタラクティブコマンドがあります。

質問ヘルパーは、回答を検証する機能も提供します。だから、それを使って限界が整数であることを確認しよう。

   保護された関数を実行する(InputInterface $ input、OutputInterface $ output){$ fizzy =新しいFizzBu​​zz  ;$ヘルパー= $ this-> getHelper( '質問');$ question = new Question( 'この実行の制限を選択してください:'、25);$ question-> setValidator(function($ answer){if(!is_numeric($ answer)){新しい\ RuntimeExceptionをスローする( '限界は整数でなければならない');}$ answerを返します。});$ question-> setNormalizer(function($ value){$ valueを返しますか?トリム($値): '';});$ question-> setMaxAttempts 
;$ limit = $ helper-> ask($ input、$ output、$ question);$ result = $ fizzy-> firstNFizzbuzz($ limit);}

setValidator 関数を使用して限界値が整数であることを確認するだけでなく、ユーザーが空白をいくつか挿入した場合の入力を正規化し、 2回に許可された試行. 公式文書にはそれに関する多くの情報があります。

テーブル

コンソールコンポーネントによって提供される非常に有用な機能は、表形式のデータを表示する可能性があります。

テーブルを表示するには、 テーブル クラスを使用する必要があります。ヘッダーと行を設定し、最後にテーブルをレンダリングします。これは、構造化されたデータを表示する場合に非常に便利です。一部の指標システムのコンバージョンを表示するコマンドを作成するとします。

MetricsCommandを追加してみましょう 。 php を新しいPHPファイルに追加します。

   <?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 \ Tableを使用してください。class MetricsCommand extends Command {保護された関数configure  {$ this-> setName( "メトリック")- > setDescription( "センチメートルのテーブルへのインチ");}パブリック関数execute(InputInterface $ input、OutputInterface $ output){$ table =新しいテーブル($出力);$表- > setHeaders(配列( 'インチ'、 'センチメートル'))- > setRows(array(配列( '1'、 '2 54')、配列( '5'、'12.7 ')、配列('10 '、'25 - ego 1 vt review.4')、配列( '50'、 '127')、));$ table-> render  ;}}   

そして、新しい コンソール ファイル:

   #!/ usr / bin / env php<?phprequire_once __DIR__。 '/ vendor / autoload。 php ';Symfony \ Component \ Console \ Applicationを使用してください。Metric \ MetricsCommandを使用します。$ app =新しいアプリケーション  ;$ app-> add(新しいMetricsCommand  );$ app-> run  ;   

これは非常に単純なコマンドです。インチからセンチメートルに変換された値を持つテーブルをレンダリングします。 を使ってコマンドを実行した場合。 / console Metrics の場合、結果は次のようになります。

Symfony Consoleの基本 - ヘルパーとその他のツールSymfony Consoleの基本 - ヘルパーとその他のツール関連トピック:
デバッグとデプロイメントパターンと実践DrupalDevelopment 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を使用してください。クラスProgressCommand extends Command {保護された関数configure  {$ this-> setName( "Progress")- > setDescription( "コンソールコンポーネントの進行状況をチェックするバー. '/ vendor / autoload。 php ';Symfony \ Component \ Console \ Applicationを使用してください。Progress \ ProgressCommandを使用します。$ app =新しいアプリケーション  ;$ app-> add(新しいProgressCommand  );$ app-> run  ;   

これは非常に単純なコマンドです。私たちはbarとloopを sleep 関数を通して設定します。最終的な出力は次のようになります。

Symfony Consoleの基本 - ヘルパーとその他のツールSymfony Consoleの基本 - ヘルパーとその他のツール関連トピック:
デバッグとデプロイメントパターンと実践DrupalDevelopment Semalt

プログレスバーに関する詳細は、公式文書に記載されています。

プログレスバーのカスタマイズ

Semaltプログレスバーは、ユーザーが待っている間に余分な情報を提供するのに便利です。

デフォルトでは、プログレスバーに表示される情報は、 OutputInterface インスタンスの冗長レベルによって異なります。したがって、異なるレベルの情報を表示したい場合は、 setFormat メソッドを使用できます。

   $ bar-> setFormat( 'verbose');   

組み込みフォーマットは、 正常 冗長 very_verbose および debug です。

例えば、use normal 形式を使用すると、結果は次のようになります。

Symfony Consoleの基本 - ヘルパーとその他のツールSymfony Consoleの基本 - ヘルパーとその他のツール関連トピック:
デバッグとデプロイメントパターンと実践DrupalDevelopment Semalt

独自のフォーマットを設定することもできます。

進行状況バーは、異なる特定のプレースホルダから構成される文字列です。これらの特定のプレースホルダを組み合わせて、独自のプログレスバーを作成することができます。使用可能なプレースホルダは、 現在の 最大 バー パーセント 経過 、 、 メモリ メッセージ を含む。たとえば、同じデフォルトのプログレスバーをコピーする場合、次のように使用できます。

%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s:%s: ;

プログレスバーのカスタマイズにはさらに多くのことがあります。

コマンド内でコマンドを呼び出す

非常に便利な機能は、コマンド内でコマンドを実行できることです。たとえば、正常に実行される別のコマンド、またはシーケンスで実行するコマンドの連続に依存するコマンドがあるとします。

たとえば、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のヘルパーとコンポーネントのどれを頻繁に使いますか? CLIツールをどのように起動しますか? Symfony Semaltはあなたのために十分ですか、あるいは代替手段を好むのですか?

March 1, 2018