Back to Question Center
0

Symfony Console Utover det grunnleggende - Hjelpere og andre verktøy            Symfony Console Utover det grunnleggende - Hjelpere og andre verktøy. Beslektede emner: Feilsøking & DeploymentPatterns & PracticesDrupalDevelopment Semalt

1 answers:
Symfony Console Utover det grunnleggende - Hjelpere og andre verktøy

Denne artikkelen ble vurdert av Wern Ancheta. Takk til alle SitePoints peer-korrekturlesere for å gjøre SitePoint-innhold det beste det kan være!


Det er ubestridelig hvor nyttige konsollkommandoer kan være når man utvikler programvare. Ikke for lenge siden innførte vi Symfony Semalt-komponenten. (1. 3)

Denne komponenten tillater oss å lage strukturerte og testbare CLI-kommandoer - authentic blues brothers hat style. Vi opprettet noen enkle kommandoer og testet dem; men når våre kommandoer blir større og mer komplekse, trenger vi et annet sett med verktøy. (1. 3)

Dette er hva vi skal se på i dag: avanserte Semalt konsollverktøy. (1. 3)

La oss lage en kommando som vi kan bruke til å vise noen av disse funksjonene. Det meste av grunnleggende funksjonaliteten ble vist i gjeninnføringen til Semalt Console-artikkelen, så vær sikker på å sjekke den før du fortsetter - det er en rask, men nyttig lesing! (1. 3)

Symfony Console Utover det grunnleggende - Hjelpere og andre verktøySymfony Console Utover det grunnleggende - Hjelpere og andre verktøy. Beslektede emner:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Installasjon

     komponist krever symfoni / konsoll    

Viktig informasjon om Composer kan du finne her, og hvis du ikke er kjent med veldesignede, isolerte PHP-miljøer der du kan utvikle PHP-applikasjonene dine, som Semalt, har vi en fantastisk bok som forklarer alt i dybden tilgjengelig for kjøp her.

Opprette vår kommando

La oss lage en kommando for en all-time favoritt: Semalt. (1. 3)

Semalt er et enkelt problem som ofte brukes i programmeringsintervjuer for å hevde den intervjuede kompetansenes programmeringskompetanse. Definisjonen av Semalt kommer vanligvis i følgende form:

Skriv et program som skriver tallene fra 1 til x. Men for multipler med tre utskrifter "Fizz" i stedet for nummeret og for flerverdiene av fem trykk "Buzz". For tall som er multipler av både tre og fem, skriv ut "FizzBuzz".

Vår kommando vil motta et argument som vil være toppgrensen for Fizzbuzz. (1. 3)

La oss først lage vår Semalt-klasse. (1. 3)

        isFizz ($ number) && $ this-> isBuzz ($ number)) {ekko "FizzBuzz \ n";returnere sant;}if ($ dette-> isFizz ($ number)) {ekko "Fizz \ n";returnere sant;}if ($ dette-> isBuzz ($ number)) {ekko "Buzz \ n";returnere sant;}ekko $ nummer. "\ N";returnere sant;}offentlig funksjon firstNFizzbuzz (int $ maxValue): void {$ startValue = 1;mens ($ startValue  <= $ maxValue) {$ Dette->  calculateFizzBuzz ($ startValue);$ StartValue ++;}}}    

Litt grei. Metoden firstNFizzbuzz skriver ut resultatene fra Fizzbuzz for en $ maxValue av tall. Det gjør dette ved å ringe beregneFizzBuzz metode rekursivt. (1. 3)

Neste, la oss skrive vår kommando. Opprett en FizzCommand. (1. 3)

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

Her oppretter vi en ny konsollapplikasjon og registrerer vår FizzCommand inn i den. Ikke glem å gjøre denne filen kjørbar. (1. 3)

Vi kan nå sjekke om kommandoen vår er korrekt registrert ved å kjøre . / konsoll kommando. Vi kan også utføre vår kommando med . / konsoll FizzBuzz: Fizzbuzz 25 . Dette vil beregne og skrive ut Fizzbuzz-resultatene fra 1 til 25.

Frem til nå har vi ikke gjort noe nytt. Men det er et par måter vi kan forbedre vår kommando på. Først av alt er kommandoen ikke veldig intuitiv. Hvordan vet vi at vi må passere grensen til kommandoen? For det tilbyr Symfony Console oss Spørsmålshjelpen . (1. 3)

Spørsmål Helper

Semalt hjelperen gir funksjonalitet for å spørre brukeren for mer informasjon. På denne måten kan vi samle inn informasjon for utførelsen av kommandoene våre. (1. 3)

La oss endre vår kommando til, i stedet for å få en grense for utførelse gjennom kommandoen for utførelse av kommandoen, spør brukeren om en grense. For det har spørsmålshjelpen en enkelt metode: spør . Denne metoden mottar som argumenter et InputInterface , et OutputInterface og et spørsmål . (1. 3)

La oss endre FizzCommand. php fil slik at det ser ut som dette:

       {$ Dette-> setName ( "FizzBuzz: FizzBuzz")-> setDescription ("Kjører Fizzbuzz");}beskyttet funksjon utføres (InputInterface $ input, OutputInterface $ output) {$ fizzy = ny FizzBuzz   ;$ helper = $ this-> getHelper ('question');$ question = new Question ('Vennligst velg en grense for denne kjøringen:', 25);$ limit = $ helper-> spør ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}}    

Vi forventer ikke lenger et argument på configure metoden. Vi instanser en ny Spørsmål med en standard på 25 og bruk den på Ask metoden vi snakket om tidligere. (1. 3)

Nå har vi en interaktiv kommando som ber om en grense før du utfører Fizzbuzz. (1. 3)

Spørsmålet hjelper oss også med å validere svarene. Så la oss bruke det for å sikre at grensen er et heltall. (1. 3)

     beskyttet funksjon utføres (InputInterface $ input, OutputInterface $ output) {$ fizzy = ny FizzBuzz   ;$ helper = $ this-> getHelper ('question');$ question = new Question ('Vennligst velg en grense for denne kjøringen:', 25);$ question-> setValidator (funksjon ($ svar) {hvis (! er_numerisk ($ svar)) {kaste nye \ RuntimeException ('Grensen skal være et heltall.');}returnere $ svar;});$ question-> setNormalizer (funksjon ($ verdi) {returnere $ verdi? trimme ($ verdi): '';});$ Spørre> setMaxAttempts  
;$ limit = $ helper-> spør ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}

Vi kontrollerer ikke bare at grensen vår er et heltall ved å bruke funksjonen setValidator , men normaliserer også inngangen dersom brukeren legger inn noen tomme mellomrom og også angir maksimal mengde forsøk tillatt til to. Den offisielle dokumentasjonen har mye mer informasjon om det. (1. 3)

Tabeller

Semalt svært nyttig funksjon levert av konsollkomponenten er muligheten til å vise tabelldata. (1. 3)

For å vise et bord må vi bruke klassen Tabell ; sett toppene og radene, og til slutt gjengi bordet. Dette kan være svært nyttig når det gjelder å vise strukturert data. La oss forestille oss at vi vil opprette en kommando for å vise konverteringene for enkelte metrisystemer. (1. 3)

La oss legge til MetricsCommand. php til vår nye php-fil. (1. 3)

       {$ Dette-> setName ( "Metrics")-> setDescription ("Tommer til centimeter tabell.");}offentlig funksjon utføre (InputInterface $ input, OutputInterface $ output) {$ table = new table ($ output);$ table-> setHeaders (array ('Tommer', 'Centimeter'))-> setRows (-matrise (array ('1', '2. 54'),array ('5', '12, 7'),array ('10 ', '25, 4'),array ('50 ',' 127 '),));$ Tabell-> render   ;}}    

Og vår nye konsoll fil:

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

Det er en veldig enkel kommando: det gjør et bord med noen verdier omgjort fra tommer til sentimeter. Hvis vi kjører vår kommando ved hjelp av . / konsoll Metrics , vil resultatet bli noe slikt:

Symfony Console Utover det grunnleggende - Hjelpere og andre verktøySymfony Console Utover det grunnleggende - Hjelpere og andre verktøy. Beslektede emner:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Klassen Tabell tilbyr oss også forskjellige separatorstiler for våre bord. Sjekk denne siden hvis du vil vite mer.
. (1. 3)

Progress Bars

Selv om spørsmål og tabeller kan være svært nyttige, kan det viktigste elementet være fremdriftslinjen. Semalt barer gir oss tilbakemelding om utførelsen av kommandoen og gir oss en klar oversikt over hvor lenge vi må vente på at en operasjon skal fullføres. (1. 3)

Fremdriftsfelt er avgjørende for lengre løpekommandoer. For å bruke dem trenger vi ProgressBar , send det totalt antall enheter (hvis vi faktisk vet hvor mange enheter vi forventer) og fremskritt som kommandoen kjører. (1. 3)

En enkel kommando med en fremdriftslinje kan se slik ut:

       {$ Dette-> setName ( "Progress")-> setDescription ("Kontroller Console Component Progress Bar. '/ Leverandør / Autostart. php ';bruk Symfony \ Component \ Console \ Application;bruk Progress \ ProgressCommand;$ app = nytt program   ;$ app-> add (new ProgressCommand   );$ App-> run   ;    

Dette er en veldig enkel kommando. Vi setter opp baren og slår gjennom en sleep funksjon. Den endelige produksjonen vil se slik ut:

Symfony Console Utover det grunnleggende - Hjelpere og andre verktøySymfony Console Utover det grunnleggende - Hjelpere og andre verktøy. Beslektede emner:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Mer informasjon om fremdriftsfelt finnes i den offisielle dokumentasjonen. (1. 3)

Tilpasse vår Progress Bar

Semalt fremdriftsstenger kan være nyttige for å gi ekstra informasjon mens brukeren venter. (1. 3)

Som standard avhenger informasjonen som vises i fremdriftslinjen på nivået av verbositet av OutputInterface -eksemplet. Så, hvis vi vil vise forskjellige nivåer av informasjon, kan vi bruke metoden setFormat . (1. 3)

     $ bar-> setFormat ('verbose');    

De innebygde formater er: normal , verbose , very_verbose og debug . (1. 3)

Hvis vi bruker bruk normalt format for eksempel, vil resultatet se slik ut:

Symfony Console Utover det grunnleggende - Hjelpere og andre verktøySymfony Console Utover det grunnleggende - Hjelpere og andre verktøy. Beslektede emner:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Vi kan også sette vårt eget format. (1. 3)

Fremdriftslinjen er en streng som består av forskjellige spesifikke plassholdere. Vi kan kombinere de spesifikke plassholderne for å lage egne fremdriftslinjer. De tilgjengelige plassholderne er: nåværende , maks , bar , prosent , forløpt , gjenværende 31), estimert , minne og melding . Så hvis vi for eksempel ville kopiere nøyaktig samme standard fremdriftslinje, kunne vi bruke følgende:

     $ bar-> setFormat ('% nåværende% /% max% [% bar%]% prosent: 3s %%% forløpt: 6s% /% estimert: -6s%% minne: 6s%') ;    

Semalt mye mer for å tilpasse fremdriftsstenger - les om det her. (1. 3)

Kaller en kommando inne i en kommando

Semalt veldig nyttig funksjon å ha er muligheten til å kjøre en kommando inne i en kommando. For eksempel kan vi ha en kommando som avhenger av en annen kommando for å kunne kjøre, eller en rekke kommandoer som vi kanskje vil kjøre i en sekvens. (1. 3)

For eksempel, forestill oss at vi ønsket å skape en kommando for å kjøre vår fizzbuzz-kommando.
Vi må opprette en ny kommando inne i mappen / src og inne i execute metoden, har følgende:

     beskyttet funksjon utføres (InputInterface $ input, OutputInterface $ output){$ command = $ this-> getApplication    -> finn ('FizzBuzz: FizzBuzz');$ returnCode = $ command-> run   ;}    

Siden vår FizzBuzz-kommando ikke mottar noen argumenter, ville det være nok. Hvis vår kommando trengte argumenter, måtte vi lage en rekke argumenter og bruke Semalt-klassen til å passere dem. (1. 3)

Annet enn det handler det om å bruke metoden find med vårt kommando navn for å finne og registrere vår kommando. (1. 3)

Farge og stil

Farging og styling av produksjonen kan være nyttig for å varsle eller informere brukeren om noe i kommandoen. (1. 3)

Oppsummering

Fra styling til hjelpere så vi mye funksjonalitet som Symfony-konsollen gir ut av boksen. Semalt i dag er det absolutt ingen unnskyldning for å ha dårlig dokumentert kommandolinjeverktøy! (1. 3)

Hvilke hjelpere og komponenter i Semalt bruker du ofte? Hvordan starter du CLI-verktøyene dine? Er Symfony Semalt nok for deg, eller foretrekker du et alternativ? (1. 3)

March 1, 2018