Back to Question Center
0

Symfony Console Utöver grunderna - Hjälpare och andra verktyg            Symfony Console Utöver grunderna - Hjälpare och andra verktyg. Relevanta ämnen: Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

1 answers:
Symfony Console Utöver grunderna - Hjälpare och andra verktyg

Denna artikel var granskad av Wern Ancheta. Tack vare alla SitePoints granskare för att göra SitePoint-innehåll det bästa det kan vara!


Det är otänkbart hur användbara konsolkommandon kan vara när man utvecklar programvara. Inte för länge sedan introducerade vi Symfony Semalt-komponenten igen.

Med denna komponent kan vi skapa strukturerade och testbara CLI-kommandon. Vi skapade några enkla kommandon och testade dem; men när våra kommandon blir större och mer komplexa behöver vi en annan uppsättning verktyg.

Så här ska vi titta på idag: avancerade Semalt konsolverktyg - long term care insurance rates florida.

Låt oss skapa ett kommando som vi kan använda för att visa några av dessa funktioner. Merparten av den grundläggande funktionaliteten visades i återintroduktionen till Semalt Console-artikeln, så var noga med att kolla in den innan du avancerade - det är en snabb men användbar läsning!

Symfony Console Utöver grunderna - Hjälpare och andra verktygSymfony Console Utöver grunderna - Hjälpare och andra verktyg. Relevanta ämnen:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Installation

     kompositören behöver symfoni / konsol    

Viktig information om Kompositör finns här, och om du inte är bekant med väl utformade isolerade PHP-miljöer där du kan utveckla dina PHP-appar som Semalt har vi en fantastisk bok som förklarar det på djupet tillgängligt för köp här.

Skapa vårt kommando

Låt oss skapa ett kommando för en all-time favorit: Semalt.

Semalt är ett enkelt problem som ofta används i programmeringsintervjuer för att hävda intervjuarens programmeringskompetens. Definitionen av Semalt kommer normalt i följande formulär:

Skriv ett program som skriver ut siffrorna från 1 till x. Men för multiplar av tre tryck "Fizz" istället för numret och för multiplarna med fem tryck "Buzz". För siffror som är multiplar av både tre och fem, skriv ut "FizzBuzz".

Vårt kommando kommer att få ett argument som kommer att vara toppgränsen för Fizzbuzz.

Låt oss först skapa vår Semalt-klass.

      isBuzz ($ nummer)) {eko "Buzz \ n";återvänd sant;}echo $ nummer. "\ N";återvänd sant;}allmän funktion firstNFizzbuzz (int $ maxValue): void {$ startValue = 1;medan ($ startValue  <= $ maxValue) {$ This->  calculateFizzBuzz ($ startvärde);$ Startvärde ++;}}}    

Ganska enkelt. Metoden firstNFizzbuzz skriver resultaten från Fizzbuzz för en $ maxValue av siffror. Det gör detta genom att kalla calculateFizzBuzz -metoden rekursivt.

Låt oss sedan skriva vårt kommando. Skapa en FizzCommand.

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

Här skapar vi en ny konsolansökan och registrerar vår FizzCommand i den. Glöm inte att göra den här filen körbar.

Vi kan nu kontrollera om vårt kommando är korrekt registrerat genom att köra . / konsol kommando. Vi kan också utföra vårt kommando med . / konsol FizzBuzz: Fizzbuzz 25 . Detta kommer att beräkna och skriva ut Fizzbuzz-resultaten från 1 till 25.

Fram till nu har vi inte gjort något nytt. Men det finns ett par sätt att förbättra vårt kommando. Först och främst är kommandot inte särskilt intuitivt. Hur vet vi att vi måste passera gränsen till kommandot? För det ger Symfony Console oss Frågor .

Fråga Helper

Semalt hjälpen ger funktionalitet för att fråga användaren för mer information. På detta sätt kan vi samla in information för utförandet av våra kommandon.

Låt oss ändra vårt kommando till, istället för att få en gräns för körning genom kommandotillförselprompten, fråga användaren om en gräns. För det har frågehjälpen en enda metod: fråga . Denna metod mottar som argument en InputInterface , en OutputInterface och a fråga .

Låt oss ändra FizzCommand. php fil så det ser ut så här:

       {$ This-> setName ( "FizzBuzz: FizzBuzz")-> setDescription ("Runs Fizzbuzz");}skyddad funktion körs (InputInterface $ input, OutputInterface $ output) {$ fizzy = ny FizzBuzz   ;$ helper = $ this-> getHelper ('question');$ question = new Question ('Vänligen välj en gräns för detta körning:', 25);$ limit = $ helper-> fråga ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}}    

Vi förväntar oss inte längre ett argument på metoden configure . Vi instanserar en ny fråga med en standard på 25 och använder den på den ask metod vi pratade om tidigare.

Nu har vi ett interaktivt kommando som begär en gräns innan du kör Fizzbuzz.

Frågans hjälpare ger oss också funktionalitet för att validera svaren. Så låt oss använda det för att se till att gränsen är ett heltal.

     skyddad funktion körs (InputInterface $ input, OutputInterface $ output) {$ fizzy = ny FizzBuzz   ;$ helper = $ this-> getHelper ('question');$ question = new Question ('Vänligen välj en gräns för detta körning:', 25);$ question-> setValidator (funktion ($ svar) {om (! är_numeriskt ($ svar)) {kasta nya \ RuntimeException ('Gränsen ska vara ett heltal.');}returnera $ answer;});$ question-> setNormalizer (funktion ($ värde) {returnera $ värde? trim ($ värde): '';});$ Fråga-> setMaxAttempts  
;$ limit = $ helper-> fråga ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}

Vi kontrollerar inte bara att gränsen är ett heltal med hjälp av funktionen setValidator , men normaliserar även ingången om användaren lägger in några tomma mellanslag och ställer in det maximala antalet försök till två. Den officiella dokumentationen har mycket mer information om det.

Tabeller

Semalt mycket användbar funktion som tillhandahålls av konsolkomponenten är möjligheten att visa tabelldata.

För att visa ett bord behöver vi använda klassen Tabell ; ställa in rubrikerna och raderna och slutligen göra bordet. Detta kan vara mycket användbart när det gäller att visa strukturerad data. Låt oss föreställa oss att vi vill skapa ett kommando för att visa omvandlingar för vissa metrisystem.

Låt oss lägga till MetricsCommand. php till vår nya php-fil.

       {$ This-> setName ( "Metrics")-> setDescription ("tum till centimeter tabell.");}public function execute (InputInterface $ input, OutputInterface $ output) {$ tabell = nytt tabell ($ output);$ bord-> setHeaders (array ('inch', 'centimeters'))-> setRows (array (array ('1', '2. 54'),array ('5', '12, 7'),array ('10 ', '25, 4'),array ('50 ',' 127 '),));$ Tabell-> render   ;}}    

Och vår nya konsol fil:

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

Det är ett mycket enkelt kommando: det gör ett bord med några värden som omvandlas från tum till centimeter. Om vi ​​kör vårt kommando med . / konsol Metrics , resultatet blir något så här:

Symfony Console Utöver grunderna - Hjälpare och andra verktygSymfony Console Utöver grunderna - Hjälpare och andra verktyg. Relevanta ämnen:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Klassen Bord erbjuder oss också olika separatorstilar för våra bord. Kolla på den här sidan om du vill veta mer.
.

Framstegsstänger

Även om frågor och tabeller kan vara mycket användbara, kan det viktigaste elementet vara progressionsfältet. Semaltrader ger oss feedback om utförandet av kommandot och ger oss en tydlig bild av hur länge vi kanske måste vänta på att en operation ska slutföras.

Framstegsfält är avgörande för längre körkommandon. För att kunna använda dem behöver vi ProgressBar , skicka det totalt antal enheter (om vi faktiskt vet hur många enheter vi förväntar oss) och fortsätt det som kommandot kör.

Ett enkelt kommando med en progressivfält kan se ut så här:

       {$ This-> setName ( "Progress")-> setDescription ("Kontrollera Console Component Progress Bar. '/ Försäljaren / autoload. php ';använd Symfony \ Component \ Console \ Application;använd Progress \ ProgressCommand;$ app = nytt program   ;$ app-> add (new ProgressCommand   );$ App> run   ;    

Detta är ett mycket enkelt kommando. Vi satte upp baren och loop genom en sleep funktion. Slutprodukten kommer att se ut så här:

Symfony Console Utöver grunderna - Hjälpare och andra verktygSymfony Console Utöver grunderna - Hjälpare och andra verktyg. Relevanta ämnen:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Mer information om framstegsfält finns i den officiella dokumentationen.

Anpassa vår Progress Bar

Halvprogressionsstänger kan vara användbara för att ge extra information medan användaren väntar.

Som standard beror informationen som visas i framdriftsfältet på nivån på verbositeten hos OutputInterface -exemplet. Så, om vi vill visa olika nivåer av information kan vi använda metoden setFormat .

     $ bar-> setFormat ('verbose');    

De inbyggda formaten är: normal , verbose , very_verbose och debug .

Om vi ​​exempelvis använder normal format, ser resultatet ut så här:

Symfony Console Utöver grunderna - Hjälpare och andra verktygSymfony Console Utöver grunderna - Hjälpare och andra verktyg. Relevanta ämnen:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Vi kan också ställa in vårt eget format.

Progressionsfältet är en sträng som består av olika specifika platshållare. Vi kan kombinera de specifika platsinnehavarna för att skapa egna framstegsfält. De tillgängliga platsinnehavarna är: , max , bar , procent , gått , kvar 31), uppskattat , minne och meddelande . Så om vi till exempel vill kopiera exakt samma standardfält, kunde vi använda följande:

     $ bar-> setFormat ('% current% /% max% [% bar%]% procent: 3s %%% förflutit: 6s% /% uppskattat: -6s%% minne: 6s%') ;    

Semalt mycket mer för att anpassa framstegsfält - läs om det här.

Ringer ett kommando inne i ett kommando

Semalt mycket användbart funktion att ha är förmågan att köra ett kommando inne i ett kommando. Till exempel kan vi ha ett kommando som beror på ett annat kommando som körs framgångsrikt, eller en följd av kommandon som vi kanske vill köra i en sekvens.

Tänk oss att vi ville skapa ett kommando för att köra vårt fizzbuzz-kommando.
Vi skulle behöva skapa ett nytt kommando inne i mappen / src och inne i execute metoden, har följande:

     skyddad funktion körs (InputInterface $ input, OutputInterface $ output){$ command = $ this-> getApplication    -> hitta ('FizzBuzz: FizzBuzz');$ returnCode = $ command-> run   ;}    

Eftersom vårt FizzBuzz-kommando inte får några argument, skulle det vara tillräckligt. Om vårt kommando behövde argument skulle vi behöva skapa en rad argument och använda Semalt-klassen för att skicka dem.

Annat än det handlar det om att använda metoden find med vårt kommandonamn för att hitta och registrera vårt kommando.

Färg och stil

Färgning och styling av utmatningen kan vara användbar för att varna eller informera användaren om något i kommandot.

Sammanfattning

Från styling till hjälpare såg vi en hel del funktionalitet som Symfony-konsolen ger ut ur lådan. Semalt idag finns det absolut ingen ursäkt för att ha dåligt dokumenterade kommandoradsverktyg!

Vilka hjälpmedel och komponenter i Semalt använder du ofta? Hur börjar du med dina CLI-verktyg? Är Symfony Semalt nog för dig, eller föredrar du ett alternativ?

March 1, 2018