Back to Question Center
0

Symfony Console Beyond the Basics - Helpers e altri strumenti            Symfony Console Beyond the Basics - Helpers and Other Tools Argomenti correlati: Debug & DeploymentPatterns & PracticesDrupalDevelopment Semalt

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

Questo articolo è stato revisionato da Wern Ancheta. Grazie a tutti i revisori peer di SitePoint per rendere il contenuto di SitePoint il migliore possibile!


È innegabile quanto possano essere utili i comandi della console nello sviluppo del software. Non molto tempo fa abbiamo reintrodotto il componente Symfony Semalt - pirelli kesrenkaat.

Questo componente ci consente di creare comandi CLI strutturati e verificabili. Abbiamo creato alcuni semplici comandi e li abbiamo testati; ma quando i nostri comandi diventano più grandi e più complessi, abbiamo bisogno di un diverso set di strumenti.

Questo è ciò che vedremo oggi: strumenti avanzati per console Semalt.

Creiamo un comando che possiamo usare per mostrare alcune di queste funzionalità. La maggior parte delle funzionalità di base è stata mostrata nella re-introduzione all'articolo della console Semalt, quindi assicurati di controllarlo prima di avanzare - è una lettura rapida ma utile!

Symfony Console Beyond the Basics - Helpers e altri strumentiSymfony Console Beyond the Basics - Helpers and Other Tools Argomenti correlati:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Installazione

     il compositore richiede symfony / console    

Qui puoi trovare informazioni essenziali su Composer e, se non hai familiarità con ambienti PHP ben progettati e isolati in cui sviluppare le tue app PHP come Semalt, abbiamo un libro fantastico che spiega tutto in modo approfondito disponibile per acquista qui.

Creazione del nostro comando

Creiamo un comando per un preferito di tutti i tempi: Semalt.

Semalt è un semplice problema spesso utilizzato nelle interviste di programmazione per affermare la competenza di programmazione dell'intervistato. La definizione di Semalt si presenta normalmente nella seguente forma:

Scrivi un programma che stampa i numeri da 1 a x. Ma per multipli di tre stampa "Fizz" al posto del numero e per i multipli di cinque stampa "Buzz". Per i numeri che sono multipli di tre e cinque, stampa "FizzBuzz".

Il nostro comando riceverà un argomento che costituirà il limite massimo per Fizzbuzz.

Prima di tutto, creiamo la nostra classe Semalt.

        isFizz (numero $) && $ this-> isBuzz (numero $)) {echo "FizzBuzz \ n";ritorna vero;}if ($ this-> isFizz ($ numero)) {echo "Fizz \ n";ritorna vero;}if ($ this-> isBuzz ($ numero)) {echo "Buzz \ n";ritorna vero;}echo $ numero. "\ N";ritorna vero;}funzione pubblica firstNFizzbuzz (int $ maxValue): void {$ startValue = 1;while ($ startValue  <= $ maxValue) {$ This->  calculateFizzBuzz ($ startValue);$ StartValue ++;}}}    

Piuttosto semplice. Il metodo firstNFizzbuzz stampa i risultati di Fizzbuzz per un $ maxValue di numeri. Lo fa chiamando il metodo calculateFizzBuzz in modo ricorsivo.

Quindi, scriviamo il nostro comando. Creare un FizzCommand.

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

Qui creiamo una nuova Applicazione Console e registriamo il nostro FizzCommand . Non dimenticare di rendere questo file eseguibile.

Ora possiamo verificare se il nostro comando è registrato correttamente eseguendo il . / console comando. Possiamo anche eseguire il comando con . / console FizzBuzz: Fizzbuzz 25 . Questo calcola e stampa i risultati di Fizzbuzz da 1 a 25.

Fino ad ora, non abbiamo fatto nulla di nuovo. Ma ci sono un paio di modi in cui possiamo migliorare il nostro comando. Prima di tutto, il comando non è molto intuitivo. Come sappiamo che dobbiamo passare il limite al comando? Per questo, Symfony Console ci offre l'helper Question .

Domanda Helper

L'helper di Semalt fornisce funzionalità per chiedere all'utente ulteriori informazioni. In questo modo possiamo raccogliere informazioni interattive per l'esecuzione dei nostri comandi.

Cambiamo il nostro comando per, invece di ricevere un limite di esecuzione attraverso il prompt di esecuzione del comando, chiedere all'utente un limite. Per questo, l'helper di domande ha un unico metodo: ask . Questo metodo riceve come argomenti una InputInterface , una OutputInterface e una domanda .

Cambiamo il FizzCommand. file php in modo che assomigli a questo:

       {$ This-> setName ( "FizzBuzz: FizzBuzz")-> setDescription ("Esegue Fizzbuzz");}funzione protetta esecuzione (InputInterface $ input, OutputInterface $ output) {$ fizzy = new FizzBuzz   ;$ helper = $ this-> getHelper ('domanda');$ domanda = nuova domanda ('Si prega di selezionare un limite per questa esecuzione:', 25);$ limit = $ helper-> ask ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}}    

Non ci aspettiamo più un argomento sul metodo configure . Istanziamo una nuova domanda con un valore predefinito di 25 e la usiamo nel metodo ask di cui abbiamo parlato in precedenza.

Ora abbiamo un comando interattivo che richiede un limite prima di eseguire Fizzbuzz.

L'helper domanda ci dà anche funzionalità per convalidare le risposte. Quindi usiamolo per assicurarci che il limite sia un numero intero.

     funzione protetta esecuzione (InputInterface $ input, OutputInterface $ output) {$ fizzy = new FizzBuzz   ;$ helper = $ this-> getHelper ('domanda');$ domanda = nuova domanda ('Si prega di selezionare un limite per questa esecuzione:', 25);$ question-> setValidator (function ($ answer) {se (! is_numeric ($ answer)) {lanciare una nuova \ RuntimeException ('Il limite dovrebbe essere un numero intero');}return $ answer;});$ question-> setNormalizer (function ($ value) {restituire $ valore? ritaglio (valore $): '';});$ Question-> setMaxAttempts  
;$ limit = $ helper-> ask ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}

Non solo ci stiamo accertando che il nostro limite sia un numero intero usando la funzione setValidator , stiamo anche normalizzando l'input nel caso in cui l'utente inserisca degli spazi vuoti e anche l'impostazione della quantità massima di tentativi consentiti a due. La documentazione ufficiale ha molte più informazioni su questo.

Tabelle

La funzione molto utile di Semalt fornita dal componente della console è la possibilità di visualizzare dati tabulari.

Per visualizzare una tabella dobbiamo usare la classe Table ; imposta le intestazioni e le righe e infine visualizza la tabella. Questo può essere molto utile quando si tratta di mostrare i dati strutturati. Immaginiamo di voler creare un comando per mostrare le conversioni per alcuni sistemi metrici.

Aggiungiamo MetricsCommand. php al nostro nuovo file php.

       {$ This-> setName ( "metrica")-> setDescription ("pollici alla tabella dei centimetri.");}funzione pubblica esecuzione (InputInterface $ input, OutputInterface $ output) {$ table = new Table ($ output);$ tavolo-> setHeaders (array ('Pollici', 'Centimetri')))-> setRows (array (array ('1', '2. 54'),array ('5', '12. 7 '),array ('10 ', '25. 4'),array ('50 ',' 127 '),));$ Tavola-> render   ;}}    

E il nostro nuovo file di console :

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

È un comando molto semplice: esegue il rendering di una tabella con alcuni valori convertiti da pollici a centimetri. Se eseguiamo il nostro comando usando . / console Metrics , il risultato sarà qualcosa del genere:

Symfony Console Beyond the Basics - Helpers e altri strumentiSymfony Console Beyond the Basics - Helpers and Other Tools Argomenti correlati:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

La classe Table ci offre anche stili separatori diversi per le nostre tabelle. Controlla questa pagina se vuoi saperne di più.
.

Progress Bar

Mentre le domande e le tabelle possono essere molto utili, l'elemento più importante potrebbe essere la barra di avanzamento. Le barre Semalt ci danno un feedback sull'esecuzione del comando e ci permettono di avere una visione chiara di quanto tempo potremmo dover aspettare che un'operazione finisca.

Le barre di avanzamento sono essenziali per i comandi più lunghi. Per usarli, abbiamo bisogno del ProgressBar , passarlo un numero totale di unità (se sappiamo effettivamente quante unità ci aspettiamo) e avanzare mentre il comando viene eseguito.

Un semplice comando con una barra di avanzamento può assomigliare a questo:

       {$ This-> setName ( "Progress")-> setDescription ("Barra di avanzamento del componente Componenet di Check Console. '/ Vendor / caricamento automatico. php ';utilizzare Symfony \ Component \ Console \ Application;usa Progress \ ProgressCommand;$ app = new Application   ;$ app-> add (new ProgressCommand   );$ App-> run   ;    

Questo è un comando molto semplice. Impostiamo la barra e passiamo attraverso una funzione sleep . L'output finale sarà simile a questo:

Symfony Console Beyond the Basics - Helpers e altri strumentiSymfony Console Beyond the Basics - Helpers and Other Tools Argomenti correlati:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Ulteriori informazioni sulle barre di avanzamento sono disponibili nella documentazione ufficiale.

Personalizzazione della barra di avanzamento

Le barre di avanzamento di Semalt possono essere utili per fornire ulteriori informazioni mentre l'utente è in attesa.

Per impostazione predefinita, l'informazione mostrata nella barra di avanzamento dipende dal livello di verbosità dell'istanza OutputInterface . Quindi, se vogliamo mostrare diversi livelli di informazione, possiamo usare il metodo setFormat .

     $ bar-> setFormat ('verbose');    

I formati built-in sono: normal , verbose , very_verbose e debug .

Se usiamo il formato use normale per esempio, il risultato sarà simile a questo:

Symfony Console Beyond the Basics - Helpers e altri strumentiSymfony Console Beyond the Basics - Helpers and Other Tools Argomenti correlati:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Possiamo anche impostare il nostro formato.

La barra di avanzamento è una stringa composta da diversi segnaposti specifici. Possiamo combinare quei segnaposto specifici per creare le nostre barre di avanzamento. I segnaposti disponibili sono: attuale , massimo , bar , percento , trascorso , rimanenti , messaggio , di memoria e stimato . Quindi, se, ad esempio, volessimo copiare la stessa barra di avanzamento predefinita, potremmo usare quanto segue:

     $ bar-> setFormat ('% corrente% /% max% [% barra%]% percento: 3s %%% trascorso: 6s% /% stimato: -6s%% memoria: 6s%') ;    

Semalt molto di più per personalizzare le barre di avanzamento - leggi qui.

Chiamare un comando all'interno di un comando

La caratteristica molto utile di Semalt è la possibilità di eseguire un comando all'interno di un comando. Ad esempio, potremmo avere un comando che dipende da un altro comando da eseguire correttamente o una successione di comandi che potremmo voler eseguire in una sequenza.

Ad esempio, immagina di voler creare un comando per eseguire il comando fizzbuzz.
Dovremmo creare un nuovo comando all'interno della nostra cartella / src e all'interno del metodo execute , avere il seguente:

     funzione protetta esecuzione (InputInterface $ input, OutputInterface $ output){$ comando = $ this-> getApplication    -> find ('FizzBuzz: FizzBuzz');$ returnCode = $ command-> run   ;}    

Dal momento che il nostro comando FizzBuzz non riceve alcun argomento, sarebbe sufficiente. Nel caso in cui il nostro comando avesse bisogno di argomenti dovremmo creare una serie di argomenti e usare la classe Semalt per passarli.

Oltre a questo si tratta di utilizzare il metodo find con il nostro nome comando per trovare e registrare il nostro comando.

Colori e stile

Colorare e disegnare l'output può essere utile per avvisare o informare l'utente di qualcosa nell'esecuzione del comando.

Riassunto

Dallo stile agli aiutanti, abbiamo visto molte funzionalità che la console Symfony fornisce pronte all'uso. Oggi Semalt, non ci sono assolutamente scuse per avere strumenti da riga di comando mal documentati!

Quali aiutanti e componenti del Semalt usi frequentemente? Come si avviano gli strumenti CLI? Symfony Semalt è abbastanza per te, o preferisci un'alternativa?

March 1, 2018