Tidak dapat dinafikan bagaimana perintah konsol yang berguna dapat ketika membangunkan perisian. Tidak lama dahulu kita memperkenalkan semula komponen Konsol Symfony.
Komponen ini membolehkan kami membuat arahan CLI berstruktur dan boleh diuji. Kami mencipta beberapa arahan mudah dan menguji mereka; Tetapi apabila perintah kita menjadi lebih besar dan lebih kompleks, kita memerlukan satu set alat yang berbeza.
inilah yang akan kita lihat hari ini: Alat Konsol Symfony Advanced.
Mari buat arahan yang boleh kita gunakan untuk menunjukkan beberapa ciri ini. Kebanyakan fungsi asas ditunjukkan dalam pengenalan semula kepada artikel Konsol Symfony, jadi pastikan untuk menyemaknya sebelum memajukan-ia adalah bacaan yang cepat tetapi berguna!
Pemasangan
<span>composer require symfony/console </span>
Membuat Perintah kami Mari buat arahan untuk kegemaran sepanjang masa: Fizzbuzz.
Tulis program yang mencetak nombor dari 1 hingga x. Tetapi untuk gandaan tiga cetak "Fizz" dan bukannya nombor dan untuk gandaan lima cetak "buzz". Untuk nombor yang merupakan gandaan dari tiga dan lima, cetak "Fizzbuzz".
Perintah kami akan menerima hujah yang akan menjadi had teratas untuk Fizzbuzz.
Pertama sekali, mari buat kelas Fizzbuzz kami.
<span>composer require symfony/console </span>
cukup mudah. Kaedah FirstNfizzBuzz () mencetak hasil FizzBuzz untuk $ maxvalue nombor. Ia melakukan ini dengan memanggil kaedah CitriteFizzBuzz () secara rekursif.
Seterusnya, mari tulis arahan kami. Buat fail FizzCommand.php dengan kandungan berikut:
<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>
dan akhirnya fail konsol kami.
<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>
di sini kami membuat aplikasi konsol baru dan mendaftarkan FizzCommand kami () ke dalamnya. Jangan lupa untuk membuat fail ini boleh dilaksanakan.
kita kini boleh menyemak sama ada arahan kami didaftarkan dengan betul dengan menjalankan perintah ./console. Kami juga boleh melaksanakan perintah kami dengan.
Sehingga kini, kami belum melakukan sesuatu yang baru. Tetapi ada beberapa cara kita dapat memperbaiki perintah kita. Pertama sekali, perintah itu tidak begitu intuitif. Bagaimanakah kita tahu bahawa kita perlu lulus had ke arahan? Untuk itu, Konsol Symfony menawarkan kepada kami penolong soalan.Soalan Helper
mari kita ubah perintah kami, bukannya menerima had pelaksanaan melalui arahan pelaksanaan arahan, minta pengguna untuk had. Untuk itu, penolong soalan mempunyai satu kaedah: tanya (). Kaedah ini menerima sebagai argumen inputInterface, outputInterface dan soalan.
mari kita ubah fail fizzcommand.php supaya kelihatan seperti ini:
#!/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>
Sekarang kita mempunyai arahan interaktif yang meminta had sebelum melaksanakan fizzbuzz.
Pembantu soalan juga memberi kita fungsi untuk mengesahkan jawapannya. Oleh itu mari kita gunakan untuk memastikan hadnya adalah integer.
<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>
Soalan Helper menawarkan lebih banyak fungsi seperti membiarkan pengguna memilih dari senarai jawapan, pelbagai jawapan, menyembunyikan jawapan pengguna, dan autocompletion. Dokumentasi rasmi mempunyai lebih banyak maklumat mengenai itu.
Jadual
Untuk memaparkan jadual yang kita perlukan untuk menggunakan kelas jadual; Tetapkan tajuk dan baris, dan akhirnya menjadikan jadual. Ini boleh menjadi sangat berguna apabila menunjukkan data berstruktur. Mari kita bayangkan kita mahu membuat arahan untuk menunjukkan penukaran untuk beberapa sistem metrik.
Mari tambahkan metricscommand.php ke fail PHP baru kami.
<span>protected function execute(InputInterface $input, OutputInterface $output){ </span> <span>$fizzy = new FizzBuzz(); </span> <span>$helper = $this->getHelper('question'); </span> <span>$question = new Question('Please select a limit for this execution: ', 25); </span> <span>$question->setValidator(function ($answer) { </span> <span>if (!is_numeric($answer)) { </span> <span>throw new <span>\RuntimeException</span>('The limit should be an integer.'); </span> <span>} </span> <span>return $answer; </span> <span>}); </span> <span>$question->setNormalizer(function ($value) { </span> <span>return $value ? trim($value) : ''; </span> <span>}); </span> <span>$question->setMaxAttempts(2); </span> <span>$limit = $helper->ask($input, $output, $question); </span> <span>$result = $fizzy->firstNFizzbuzz($limit); </span> <span>} </span>
<span>composer require symfony/console </span>
Ia adalah arahan yang sangat mudah: ia menjadikan jadual dengan beberapa nilai yang ditukar dari inci ke sentimeter. Jika kita menjalankan arahan kita menggunakan ./Console Metrics, hasilnya akan menjadi sesuatu seperti ini:
Progress Bar
Bar kemajuan adalah penting untuk arahan berjalan yang lebih lama. Untuk menggunakannya, kita memerlukan bar kemajuan, lulus jumlah unit (jika kita benar -benar tahu berapa banyak unit yang kita harapkan) dan memajukannya sebagai arahan yang dilaksanakan.
Perintah mudah dengan bar kemajuan mungkin kelihatan seperti ini:
<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>
maklumat lanjut mengenai bar kemajuan boleh didapati dalam dokumentasi rasmi.
Menyesuaikan bar kemajuan kami
Secara lalai, maklumat yang ditunjukkan dalam bar kemajuan bergantung pada tahap kelebihan OutputInterface Instance. Jadi, jika kita mahu menunjukkan tahap maklumat yang berbeza, kita boleh menggunakan kaedah setFormat ().
Format terbina dalam adalah: normal, verbose, sangat_verbose dan 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>
Jika kita menggunakan format penggunaan biasa sebagai contoh, hasilnya akan kelihatan seperti ini:
kita juga boleh menetapkan format kita sendiri.
Terdapat lebih banyak lagi untuk menyesuaikan bar kemajuan - baca tentangnya di sini.
<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>
Satu lagi ciri yang sangat berguna adalah keupayaan untuk menjalankan arahan di dalam arahan. Sebagai contoh, kami mungkin mempunyai arahan yang bergantung kepada arahan lain untuk berjaya dijalankan, atau penggantian arahan yang mungkin kami ingin lari dalam urutan.
<span>composer require symfony/console </span>
Oleh kerana arahan FizzBuzz kami tidak menerima sebarang hujah, itu akan mencukupi. Sekiranya arahan kami memerlukan hujah, kami perlu membuat pelbagai hujah dan menggunakan kelas ArrayInput untuk menyampaikannya.
selain itu semua tentang menggunakan kaedah mencari () dengan nama arahan kami untuk mencari dan mendaftarkan arahan kami.
Mewarna dan gaya output boleh berguna untuk memberi amaran atau memaklumkan kepada pengguna tentang sesuatu dalam pelaksanaan perintah. Untuk itu, kita hanya perlu menambah tag berikut ke kaedah WriteLn () kami, sama seperti yang berikut:
<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>
Terdapat juga pilihan untuk menentukan gaya kita sendiri menggunakan kelas OutputFormatTtersTyle:
<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>
Maklumat lanjut mengenai gaya output boleh didapati di sini.
Dari gaya kepada pembantu, kami melihat banyak fungsi yang disediakan oleh Konsol Symfony dari kotak. Selepas hari ini, tidak ada alasan untuk mempunyai alat baris perintah yang didokumentasikan dengan teruk!
Pembantu dan komponen konsol yang sering anda gunakan? Bagaimana anda memulakan alat CLI anda? Adakah konsol Symfony cukup untuk anda, atau adakah anda lebih suka alternatif?
Pembantu dalam Konsol Symfony adalah kelas yang menyediakan fungsi tambahan untuk arahan. Mereka boleh diakses menggunakan kaedah GetHelper () arahan. Konsol Symfony merangkumi beberapa pembantu terbina dalam, seperti soal selidik untuk input interaktif, ProgressBarhelper untuk Bar Kemajuan, dan TableHelper untuk Data Tabular. > Konsol Symfony menyediakan kelas CommandTester untuk menguji arahan. Kelas CommandTester membolehkan anda melaksanakan arahan dengan input tertentu dan menangkap output. Anda kemudian boleh membuat pernyataan pada output untuk mengesahkan tingkah laku perintah.
Bagaimana saya boleh menggunakan komponen Konsol Symfony di luar kerangka Symfony? yang bermaksud ia boleh digunakan di luar kerangka Symfony. Anda boleh memasangnya menggunakan komposer dan menggunakannya untuk membina aplikasi CLI dalam mana -mana projek PHP. daripada output konsol. Anda boleh menggunakan kod warna untuk menukar warna teks, kod format untuk menukar gaya teks, dan tag untuk membuat bahagian. Anda juga boleh menggunakan kelas ProgressBar dan meja untuk membuat bar dan jadual kemajuan.
Tambah kelas arahan berganda ke aplikasi. Setiap kelas arahan harus melanjutkan kelas arahan dan melaksanakan kaedah konfigurasi () dan melaksanakan (). Anda kemudian boleh menggunakan kaedah Tambah () aplikasi untuk menambah arahan. Tugas dengan membuat arahan yang melaksanakan tugas -tugas tertentu dan menjalankan arahan ini dari baris arahan atau dari skrip. Anda juga boleh menjadualkan perintah untuk dijalankan pada selang waktu tertentu menggunakan penjadual tugas seperti Cron.
Atas ialah kandungan terperinci Konsol Symfony Beyond the Asas - Pembantu dan Alat Lain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!