Back to Question Center
0

Symfony Console Beyond the Basics - Helpers and Other Tools            Symfony Console Beyond the Basics - Helpers and Other ToolsBest Topics: Debugging & DeploymentPatterns & AmalanDrupalDevelopment Semalt

1 answers:
Symfony Console Beyond the Basics - Helpers and Other Tools

Artikel ini dikupas oleh Wern Ancheta. Terima kasih kepada semua pengulas rakan sebaya SitePoint untuk membuat kandungan SitePoint sebaik mungkin!


Tidak dapat dinafikan bagaimana arahan konsol berguna boleh dilakukan semasa membangunkan perisian. Tidak terlalu lama dahulu kita memperkenalkan semula komponen Symfony Semalt.

Komponen ini membolehkan kami membuat perintah CLI berstruktur dan boleh diuji - lampada a sospensione negozio online. Kami mencipta beberapa perintah mudah dan menguji mereka; tetapi apabila arahan kami menjadi lebih besar dan lebih rumit, kami memerlukan set alat yang berbeza.

Inilah yang akan kita lihat hari ini: alat konsol Semalt maju.

Mari buat arahan yang boleh kita gunakan untuk menunjukkan beberapa ciri ini. Kebanyakan fungsi asas ditunjukkan dalam pengenalan semula kepada artikel konsol Semalt, jadi pastikan untuk menyemaknya sebelum memajukan - bacaan yang cepat tetapi bermanfaat!

Symfony Console Beyond the Basics - Helpers and Other ToolsSymfony Console Beyond the Basics - Helpers and Other ToolsBest Topics:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Pemasangan

     komposer memerlukan symfony / console    
Maklumat penting tentang Komposer boleh didapati di sini, dan jika anda tidak biasa dengan persekitaran PHP terasing yang direka dengan baik untuk membangunkan aplikasi PHP anda seperti Semalt, kami mempunyai sebuah buku yang hebat yang menerangkannya secara mendalam yang tersedia untuk beli di sini.

Mencipta arahan kami

Mari buat arahan untuk semua masa kegemaran: Semalt.

Semalt adalah masalah mudah yang sering digunakan dalam wawancara pengaturcaraan untuk menegaskan kecekapan pengaturcaraan penemuduga. Takrif Semalat biasanya datang dalam bentuk berikut:

Tuliskan program yang mencetak nombor dari 1 hingga x. Tetapi untuk gandaan tiga cetakan "Fizz" bukan nombor dan untuk gandaan lima cetakan "Buzz". Untuk nombor yang gandaan kedua-dua tiga dan lima, cetak "FizzBuzz".

Perintah kami akan menerima hujah yang akan menjadi had utama untuk Fizzbuzz.

Pertama sekali, mari kita buat kelas Semalt kita.

        isFizz ($ number) && $ this-> isBuzz ($ number)) {echo "FizzBuzz \ n";kembali benar;}jika ($ this-> isFizz ($ number)) {echo "Fizz \ n";kembali benar;}jika ($ this-> isBuzz ($ number)) {echo "Buzz \ n";kembali benar;}echo $ number. "\ n";kembali benar;}fungsi awam firstNFizzbuzz (int $ maxValue): void {$ startValue = 1;sementara ($ startValue  <= $ maxValue) {$ this->  calculateFizzBuzz ($ startValue);$ startValue ++;}}}    

Pretty straightforward. Kaedah firstNFizzbuzz mencetak hasil Fizzbuzz untuk nombor $ maxValue nombor. Ia melakukan ini dengan memanggil kaedah calculateFizzBuzz secara rekursif.

Seterusnya, tulis arahan kami. Buat FizzCommand.

     #! / Usr / bin / env php ;$ app-> add (baru FizzCommand   );$ app-> run   ;    

Di sini kami buat Aplikasi Konsol baru dan daftarkan kami FizzCommand ke dalamnya. Jangan lupa untuk membuat fail ini dapat dieksekusi.

Kita kini boleh menyemak jika arahan kami didaftarkan dengan betul dengan menjalankan . / konsol . Kami juga boleh melaksanakan arahan kami dengan . / konsol FizzBuzz: Fizzbuzz 25 . Ini akan mengira dan mencetak keputusan Fizzbuzz dari 1 hingga 25.

Sehingga kini, kami belum melakukan sesuatu yang baru. Tetapi ada beberapa cara yang kita boleh memperbaiki arahan kita. Pertama sekali, arahan itu tidak terlalu intuitif. Bagaimanakah kita tahu bahawa kita perlu lulus had itu? Untuk itu, Konsol Symfony menawarkan kepada kami Pembantu soalan .

Pembantu Soalan

Penolong Semalt menyediakan fungsi untuk meminta pengguna untuk maklumat lanjut. Dengan cara ini, kita boleh mengumpul maklumat secara interaktif untuk melaksanakan perintah kami.

Mari kita ubah arahan kami, bukannya menerima had pelaksanaan melalui arahan pelaksanaan arahan, minta pengguna untuk had. Untuk itu, pembantu soalan mempunyai satu kaedah: bertanya . Kaedah ini menerima sebagai argumen InputInterface , satu OutputInterface dan satu soalan .

Mari kita ubah FizzCommand. php fail supaya kelihatan seperti ini:

       {$ this-> setName ("FizzBuzz: FizzBuzz")-> setDescription ("Jalankan Fizzbuzz");}fungsi yang dilindungi dilaksanakan (InputInterface $ input, output OutputInterface $) {$ fizzy = new FizzBuzz   ;$ helper = $ this-> getHelper ('soalan');$ question = new Question ('Sila pilih had untuk pelaksanaan ini:', 25);$ limit = $ helper-> ask ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}}    

Kita tidak lagi mengharapkan argumen pada kaedah mengkonfigurasi . Kami memberi contoh baru Soalan dengan default 25 dan menggunakannya pada kaedah bertanya yang telah kita bicarakan sebelumnya.

Sekarang kita mempunyai perintah interaktif yang meminta had sebelum melaksanakan Fizzbuzz.

Pembantu soalan juga memberi kita fungsi untuk mengesahkan jawapannya. Oleh itu, mari gunakannya untuk memastikan hadnya ialah integer.

     fungsi yang dilindungi melaksanakan (InputInterface $ input, output OutputInterface $) {$ fizzy = new FizzBuzz   ;$ helper = $ this-> getHelper ('soalan');$ question = new Question ('Sila pilih had untuk pelaksanaan ini:', 25);$ question-> setValidator (function ($ answer) {jika (! is_numeric ($ answer)) {membuang baru \ RuntimeException ('Had harus menjadi integer.');}kembali jawapan $;});$ question-> setNormalizer (function ($ value) {kembali nilai $? trim ($ nilai): '';});$ question-> setMaxAttempts  
;$ limit = $ helper-> ask ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}

Bukan sahaja kami memastikan bahawa batas kami adalah integer dengan menggunakan fungsi setValidator , kami juga menormalkan input sekiranya pengguna menyisipkan beberapa ruang kosong dan juga menetapkan jumlah maksimum percubaan dibenarkan dua. Dokumentasi rasmi mempunyai lebih banyak maklumat mengenai hal itu.

Jadual

Fungsi Semalt sangat berguna yang disediakan oleh komponen konsol adalah kemungkinan untuk memaparkan data jadual.

Untuk memaparkan jadual, kita perlu menggunakan kelas Jadual ; tetapkan tajuk dan baris, dan akhirnya membuat jadual. Ini boleh menjadi sangat berguna apabila menunjukkan data berstruktur. Mari bayangkan kami ingin membuat arahan untuk menunjukkan penukaran untuk beberapa sistem metrik.

Mari tambahkan MetricsCommand. php ke fail php baru kami.

       {$ this-> setName ("Metrik")-> setDescription ("inci ke inci sentimeter.");}fungsi awam laksanakan (InputInterface $ input, output OutputInterface $) {$ table = new Table (output $);jadual $-> setHeaders (array ('Inci', 'Centimeters'))-> setRows (array (array ('1', '2. 54'),array ('5', '12.7 '),array ('10 ', '25.4'),array ('50 ',' 127 '),));$ table-> render   ;}}    

Dan konsol baru konsol kami:

     #! / Usr / bin / env php ;$ app-> add (MetricsCommand baru);$ app-> run   ;    

Ia adalah arahan yang sangat mudah: ia menjadikan jadual dengan beberapa nilai ditukar dari inci ke sentimeter. Sekiranya kita menjalankan arahan kami menggunakan . / konsol Metrik , hasilnya akan menjadi seperti ini:

Symfony Console Beyond the Basics - Helpers and Other ToolsSymfony Console Beyond the Basics - Helpers and Other ToolsBest Topics:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Kelas Jadual juga menawarkan gaya pemisah berbeza untuk jadual kami. Semak halaman ini jika anda ingin mengetahui lebih lanjut.
.

Bar Kemajuan

Walaupun soalan dan jadual boleh sangat berguna, elemen yang paling penting mungkin bar kemajuan. Bar Semalt memberi kami maklum balas tentang pelaksanaan arahan dan membolehkan kami mempunyai pandangan yang jelas tentang berapa lama kita mungkin perlu menunggu operasi selesai.

Bar kemajuan adalah penting untuk arahan berjalan lebih lama. Untuk menggunakannya, kita perlu ProgressBar , lulus jumlah unit (jika kita benar-benar tahu bilangan unit yang kita harapkan) dan memajukannya sebagai arahan yang dilaksanakan.

Perintah mudah dengan bar kemajuan mungkin kelihatan seperti ini:

       {$ this-> setName ("Kemajuan")-> setDescription ("Semak hab progren componenet Console. '/ vendor / autoload. php ';gunakan Symfony \ Component \ Console \ Application;gunakan Kemajuan \ ProgressCommand;$ app = Permohonan baru   ;$ app-> add (ProgressCommand baru);$ app-> run   ;    

Ini adalah arahan yang sangat mudah. Kami menyediakan bar dan gelung melalui fungsi tidur tidur . Keluaran akhir akan kelihatan seperti ini:

Symfony Console Beyond the Basics - Helpers and Other ToolsSymfony Console Beyond the Basics - Helpers and Other ToolsBest Topics:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Maklumat lanjut mengenai bar kemajuan boleh didapati di dokumentasi rasmi.

Menyesuaikan Bar Kemajuan Kami

Bar kemajuan Semalt dapat berguna untuk memberikan maklumat tambahan sementara pengguna menunggu.

Secara lalai, maklumat yang ditunjukkan dalam bar kemajuan bergantung kepada tahap kelambatan dari OutputInterface contoh. Jadi, jika kita mahu menunjukkan tahap maklumat yang berlainan kita boleh menggunakan kaedah setFormat .

     $ bar-> setFormat ('verbose');    

Format terbina dalam adalah: normal , verbose , very_verbose dan debug .

Jika kita menggunakan format biasa seperti , hasilnya akan kelihatan seperti ini:

Symfony Console Beyond the Basics - Helpers and Other ToolsSymfony Console Beyond the Basics - Helpers and Other ToolsBest Topics:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Kita juga boleh menetapkan format kita sendiri.

Bar kemajuan adalah rentetan yang terdiri daripada ruang letak tertentu yang berbeza. Kami boleh menggabungkan mereka ruang letak tertentu untuk mencipta bar kemajuan kita sendiri. Pemegang tempat yang ada ialah: semasa , max , bar , peratus , 31), anggaran , memori dan mesej . Jadi jika, misalnya, kami ingin menyalin bar kemajuan lalai yang sama, kami boleh menggunakan yang berikut:

     $ bar-> setFormat ('% semasa% /% maks% [% bar%]% peratus: 3s %%% berlalu: 6s% /% dianggarkan: -6s%% memory: 6s%') ;    

Lebih banyak lagi untuk menyesuaikan bar kemajuan - bacalah mengenainya di sini.

Memanggil arahan di dalam arahan

Ciri Semalt yang sangat berguna ialah keupayaan untuk menjalankan arahan di dalam perintah. Contohnya, kita mungkin mempunyai perintah yang bergantung kepada perintah lain untuk berjaya dijalankan, atau perintah berturut-turut yang mungkin kita jalankan dalam urutan.

Sebagai contoh, bayangkan kami ingin membuat arahan untuk menjalankan arahan fizzbuzz kami.
Kita perlu membuat arahan baru di dalam folder kami / src dan di dalam kaedah 58 melaksanakan
, mempunyai yang berikut:

     fungsi yang dilindungi melaksanakan (masukan InputInterface $, output OutputInterface $){$ command = $ this-> getApplication    -> find ('FizzBuzz: FizzBuzz');$ returnCode = $ command-> run   ;}    

Oleh kerana arahan FizzBuzz kami tidak menerima apa-apa hujah, itu cukup. Sekiranya arahan kami memerlukan hujah-hujah, kita perlu membuat pelbagai hujah dan menggunakan kelas Semalt untuk menyebarkannya.

Selain itu, gunakan kaedah cari dengan nama arahan kami untuk mencari dan mendaftarkan arahan kami.

Warna dan Gaya

Mewarna dan penggayaan output boleh berguna untuk memberi peringatan atau memaklumkan pengguna tentang sesuatu dalam pelaksanaan perintah.

Menyimpulkan

Dari gaya kepada pembantu, kita melihat banyak fungsi yang disediakan oleh konsol Symfony daripada kotak. Semalt hari ini, sememangnya tidak ada alasan untuk mempunyai alat baris arahan yang teruk!

Pembantu dan komponen Semalt yang kerap digunakan? Bagaimana anda memulakan alat CLI anda? Adakah Symfony Semalt cukup untuk anda, atau adakah anda lebih suka alternatif?

March 1, 2018