Back to Question Center
0

Symfony Console perusasiat - avustajat ja muut työkalut            Symfony Console Perustietojen lisäksi - Helpers and Other ToolsRelated Topics: Debugging & DeploymentPatterns & KäytännötDrupalDevelopment Semalt

1 answers:
Symfony Console perusteet - avustajat ja muut työkalut

Tätä artikkelia vertaili Wern Ancheta. Kiitos kaikille SitePointin vertaisarvioijille, että SitePoint-sisältöä saadaan parasta mahdollista!


On kiistatonta, kuinka hyödyllisiä konsolikomentoja voi olla ohjelmiston kehittämisessä. Vielä kauan sitten otimme jälleen käyttöön Symfony Semalt -komponentin.

Tämän komponentin ansiosta voimme luoda jäsenneltyjä ja testattavia CLI-komentoja. Luomme yksinkertaisia ​​käskyjä ja testimme niitä; mutta kun komennot tulevat suuremmiksi ja monimutkaisemmiksi, tarvitsemme erilaisia ​​työkaluja - cheap bar chairs and stools.

Tarkastelemme tätä tänään: kehittyneitä Semalt-konsolin työkaluja.

Luomme komennon, jonka avulla voimme näyttää joitain näistä ominaisuuksista. Suurin osa perustoiminnoista näytettiin uudestaan ​​käyttöön Semalt-konsoli-artikkelissa, joten tarkista se ennen etenemistä - se on nopea mutta hyödyllinen lukea!

Symfony Console perusasiat - avustajat ja muut työkalutSymfony Console Perustietojen lisäksi - Helpers and Other ToolsRelated Topics:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Asennus

     säveltäjä vaatii symfonia / konsolia    

Tärkeää tietoa Säveltäjästä löydät täältä, ja jos et tunne hyvin suunniteltuja erillisiä PHP-ympäristöjä, joiden avulla voit kehittää PHP-sovelluksia kuten Semaltia, meillä on fantastinen kirja, joka selittää sen syvällisesti osta täältä.

Komentoomme luominen

Luomme komennon kaikkien aikojen suosikille: Semalt.

Semalt on yksinkertainen ongelma, jota usein käytetään ohjelmointihaastatteluissa haastateltavan ohjelmointitaitoa. Semaltin määritelmä on tavallisesti seuraavanlainen:

Kirjoita ohjelma, joka tulostaa numerot 1: stä x: ään. Mutta kolmen tulostuksen kerrannaisiksi "Fizz" numeron sijasta ja viiden painoksen "Buzz" kerrannaisiksi. Jos numeroita käytetään molempien kolmen ja viiden kerran, paina "FizzBuzz".

Komentoomme saa argumentin, joka on Fizzbuzzin yläraja.

Ensinnäkin luomme Semalt-luokan.

        isFizz ($ numero) && $ tämä-> isBuzz ($ numero)) {echo "FizzBuzz \ n";palaa true;}if ($ this-> isFizz ($ numero)) {echo "Fizz \ n";palaa true;}if ($ this-> isBuzz ($ numero)) {kaiku "Buzz \ n";palaa true;}echo $ numero. "\ N";palaa true;}julkinen toiminto firstNFizzbuzz (int $ maxValue): void {$ startValue = 1;kun ($ startValue  <= $ maxValue) {$ This->  calculateFizzBuzz ($ startValue);$ StartValue ++;}}}    

Melko suoraviivainen. Ensimmäinen firstNFizzbuzz -menetelmä tulostaa Fizzbuzzin tulokset numeroille $ maxValue . Se tekee tämän soittamalla laskemaanFizzBuzz -menetelmän rekursiivisesti.

Seuraavaksi kirjoitetaan komento. Luo FizzCommand.

     #! / Usr / bin / env php ;$ app-> lisää (uusi FizzCommand   );$ Sovellus-> Suorita   ;    

Täältä luodaan uusi konsoli-sovellus ja rekisteröidään FizzCommand siihen. Älä unohda tehdä tiedostoa suoritettavaksi.

Voimme nyt tarkistaa, onko komento oikein rekisteröitymällä suorittamalla . / console -komennolla. Voimme myös suorittaa komentoamme . / konsoli FizzBuzz: Fizzbuzz 25 . Tämä laskee ja tulostaa Fizzbuzz-tulokset 1-25.

Tähän asti emme ole tehneet mitään uutta. Mutta on olemassa pari tapaa, jolla voimme parantaa käskyämme. Ensinnäkin komento ei ole kovin intuitiivinen. Kuinka tiedämme, että meidän on siirrettävä raja komentoon? Tästä syystä Symfony Console tarjoaa meille Kysymysavustajan .

Kysymysavustaja

Semalt-apulainen tarjoaa toiminnallisuutta pyytääkseen käyttäjää lisätietoja. Näin voimme kerätä interaktiivisesti tietoja komentojemme suorittamiseen.

Vaihdo käskymme, sen sijaan, että saisitte suorituksen rajan komentokehotteen kautta, kysy käyttäjältä raja. Tällöin kysymysavustajalla on yksi ainoa menetelmä: ask . Tämä menetelmä saa argumentteina InputInterface , OutputInterface ja kysymyksen .

Vaihdetaan FizzCommand. php tiedosto niin näyttää tältä:

       {$ This-> setName ( "FizzBuzz: FizzBuzz")-> setDescription ("Runs Fizzbuzz");}suojattu toiminto toteutetaan (InputInterface $ -tulo, OutputInterface $ lähtö) {$ fizzy = uusi FizzBuzz   ;$ helper = $ this-> getHelper ('kysymys');$ question = new Kysymys ('Valitse raja tähän suoritukseen:', 25);$ raja = $ helper-> ask ($ panos, $ lähtö, $ kysymys);$ result = $ fizzy-> firstNFizzbuzz ($ raja);}}    

Emme enää odota argumenttia configure -menetelmällä. Lyhennämme uuden kysymyksen , jonka oletusarvo on 25 ja käytämme sitä ask menetelmää, josta puhumme aikaisemmin.

Nyt meillä on interaktiivinen komento, joka pyytää rajausta ennen Fizzbuzzin suorittamista.

Kysymys avustaja antaa meille myös toiminnallisuuden vastausten vahvistamiseksi. Joten käytämme sitä varmistaaksemme, että raja on kokonaisluku.

     Suojattu toiminto suoritetaan (InputInterface $ -tulo, OutputInterface $ lähtö) {$ fizzy = uusi FizzBuzz   ;$ helper = $ this-> getHelper ('kysymys');$ question = new Kysymys ('Valitse raja tähän suoritukseen:', 25);$ question-> setValidator (function ($ answer) {jos (! is_numeric ($ answer)) {heittää uusi \ RuntimeException ("Raja on kokonaisluku.");}palaa $ vastaus;});$ question-> setNormalizer (funktio ($ arvo) {palaa $ arvo? trim ($ arvo): '';});$ Kyseenalaisia> setMaxAttempts  
;$ raja = $ helper-> ask ($ panos, $ lähtö, $ kysymys);$ result = $ fizzy-> firstNFizzbuzz ($ raja);}

Ei vain varmistamme, että raja on kokonaisluku käyttämällä setValidator -toimintoa, myös normalisoimme syötteen siinä tapauksessa, että käyttäjä lisää joitakin tyhjiä tiloja ja asettaa myös yritykset sallitaan kahteen. Virallisilla asiakirjoilla on paljon enemmän tietoa siitä.

Pöydät

Konsolikomponentin tarjoama erittäin hyödyllinen toiminto on mahdollisuus esittää taulukkotietoja.

Taulukon näyttämiseksi meidän on käytettävä Taulukko -luokkaa; asettaa otsikot ja rivit ja lopulta tehdä taulukko. Tämä voi olla erittäin hyödyllinen, kun on kyse jäsenneltyjen tietojen esittämisestä. Kuvitellaan, että haluamme luoda komennon näyttää joitain metrijärjestelmän tuloksia.

Lisätään MetricsCommand. php uusiin php-tiedostoihimme.

       {$ This-> setName ( "Metrics")-> setDescription ("Inches to centimeters table.");}julkinen toiminto toteutetaan (InputInterface $ -tulo, OutputInterface $ lähtö) {$ table = uusi taulukko ($ output);$ table-> setHeaders (array ("Inches", "Centimeters"))-> setRows (array (array ('1', '2. 54'),array ('5', '12, 7'),array ('10 ', '25, 4'),array ('50 ',' 127 '),));$ Pöytä-> tee   ;}}    

Ja uusi konsoli tiedosto:

     #! / Usr / bin / env php ;$ app-> lisää (uusi MetricsCommand   );$ Sovellus-> Suorita   ;    

Se on hyvin yksinkertainen komento: se tekee taulukon, jossa on joitain arvoja, jotka on muunnettu tuumilta senttimetreihin. Jos käytämme komentoamme . / console Metrics , tulos on tällainen:

Symfony Console perusasiat - avustajat ja muut työkalutSymfony Console Perustietojen lisäksi - Helpers and Other ToolsRelated Topics:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Taulukko luokka tarjoaa myös meille erilaisia ​​erottimen tyylejä pöytiin. Tarkista tämä sivu, jos haluat tietää enemmän.
.

Progress-palkit

Vaikka kysymykset ja taulukot voivat olla erittäin hyödyllisiä, tärkein tekijä voisi olla edistysaskel. Vasemmanpuoleiset palkit antavat meille palautetta komennon suorittamisesta ja antavat meille selkeän kuvan siitä, kuinka kauan voimme joutua odottamaan operaation loppuun.

Etenemispalkit ovat välttämättömiä pitempiaikaisille komentojoille. Käyttääksesi niitä, tarvitsemme ProgressBar , siirtäkää se kokonaismäärän yksiköitä (jos todella tiedämme, kuinka monta yksikköä me odotamme) ja siirrämme sen komennon suorittamiseksi.

Yksinkertainen etenemispalkki käsky voi näyttää tältä:

       {$ This-> setName ( "Progress")-> setDescription ("Tarkista konsolikomponentin edistymispalkki. '/ Myyjä / automaattilataustiedostoon. php ";käytä Symfony \ Component \ Console \ Application;käytä Progress \ ProgressCommand;$ app = uusi sovellus   ;$ app-> lisää (uusi ProgressCommand   );$ Sovellus-> Suorita   ;    

Tämä on hyvin yksinkertainen käsky. Asettelimme palkin ja silmukan sleep -toiminnon kautta. Lopullinen tuotos näyttää tältä:

Symfony Console perusasiat - avustajat ja muut työkalutSymfony Console Perustietojen lisäksi - Helpers and Other ToolsRelated Topics:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Lisätietoa edistymispalkkeista löytyy virallisista asiakirjoista.

Progress-palkin mukauttaminen

Vääristymän etenemispalkit voivat olla hyödyllisiä lisätietojen saamiseksi, kun käyttäjä odottaa.

Oletusarvon mukaan etenemispalkissa näkyvät tiedot riippuvat OutputInterface -tyyppisen lausuntatavan tasosta. Joten, jos haluamme näyttää eri tietoa, voimme käyttää setFormat -menetelmää.

     $ bar-> setFormat ('verbose');    

Sisäänrakennetut tiedostomuodot ovat: normaali , verbose , very_verbose ja debug .

Jos käytämme esimerkiksi normaalia formaattia, tulos näyttää tältä:

Symfony Console perusasiat - avustajat ja muut työkalutSymfony Console Perustietojen lisäksi - Helpers and Other ToolsRelated Topics:
Debugging & DeploymentPatterns & PracticesDrupalDevelopment Semalt

Voimme myös asettaa oman muodon.

Etenemispalkki on merkkijono, joka koostuu erilaisista paikkamerkkeistä. Voimme yhdistää kyseiset paikanvaraajat luomaan omat etenemispalkit. Käytettävissä olevat paikanvaraajat ovat seuraavat: jäljellä olevat , maksimi , bar , prosenttia , , 31), arvioitu , muistin ja viestin . Joten jos halusimme esimerkiksi kopioida täsmälleen samanlaisen oletuspalkin, voimme käyttää seuraavia:

(%) Prosentteina: 3s %%% kulunut: 6s% /% arvioitu: -6s%% muistia: 6s% ')
     $ bar-> setFormat ;    

Muokkaa paljon etenemispalkkien muokkaamista - lue siitä täältä.

Komennon sisäisen komennon kutsuminen

Epätavallinen erittäin hyödyllinen ominaisuus on on kyky suorittaa komento sisällä komento. Esimerkiksi meillä voi olla komento, joka riippuu toisesta komennosta menestyksekkäästi suoritettavaksi tai sellaisten komentoiden peräkkäin, jotka haluamme suorittaa sekvenssissä.

Kuvittele esimerkiksi, että halusimme luoda komennon fizbuzz-komennon suorittamiseen.
Meidän on luotava uusi komento / src -kansiossa ja execute -menetelmässä:

     suoritettu suojattu toiminto (InputInterface $ -tulo, OutputInterface $ lähtö){$ command = $ this-> getApplication    -> find ('FizzBuzz: FizzBuzz');$ returnCode = $ komento-> run   ;}    

Koska FizzBuzz-komento ei saa mitään argumentteja, se olisi tarpeeksi. Jos komento tarvitsee argumentteja, meidän olisi luotava joukko argumentteja ja käytämme Semalt-luokkaa niiden siirtämiseen.

Sen lisäksi, että kyse on find -menetelmästä käskynimellämme komennon löytämiseksi ja rekisteröimiseksi.

Väri ja tyyli

Tuotteen väritys ja muotoilu voivat olla hyödyllisiä käyttäjän ilmoittamisessa tai ilmoittamisessa komennon toteutuksessa.

Yhteenveto

Suunnittelusta avustajiin nähtiin paljon toimintoja, joita Symfony konsoli tarjoaa laatikosta. Nykyään ei ole mitään tekosyytä, jos dokumentoitavat komentorivin työkalut ovat huonosti dokumentoituja!

Mitkä avustajat ja komponentit käytät usein? Miten aloitat CLI-työkalusi? Onko Symfony Semalt riitä sinulle, vai mieluummin vaihtoehto?

March 1, 2018