Back to Question Center
0

Symfony Console Beyond the Basics - помощници и други инструменти            Симфони конзола отвъд основите - помощници и други инструменти Свързани теми: Отстраняване на грешки & Разгъване на платформата & ПрактикиДрупално развитие Семалт

1 answers:
Симфони конзола отвъд основите - помощници и други инструменти

Тази статия беше прегледана от Върн Анчета. Благодарение на всички партньорски рецензенти на SitePoint за това, че съдържанието на SitePoint е най-доброто, което може да бъде!


Безспорно е колко полезни могат да бъдат командите при разработването на софтуер. Не много отдавна отново въведехме компонента Symfony Semalt.

Този компонент ни позволява да създаваме структурирани и проверими CLI команди - φ μπαλδιμτση. Създадохме няколко прости команди и ги изпробвахме; но когато нашите команди стават по-големи и по-сложни, се нуждаем от различен набор от инструменти.

Това е, което ще разгледаме днес: усъвършенствани инструменти за семалтови конзоли.

Нека да създадем команда, която да използваме, за да покажем някои от тези функции. Повечето от основните функции бяха показани в повторното въвеждане в статията за семалтовата конзола, така че не забравяйте да я проверите, преди да напредвате - това е бързо, но полезно четене!

Symfony Console Beyond the Basics - помощници и други инструментиСимфони конзола отвъд основите - помощници и други инструменти Свързани теми:
Отстраняване на грешки и разполаганеПартньори и практикиDrupalDevelopment Семалт

Монтаж

     композитор изисква symfony / конзола    

Съществена информация за композитора може да намерите тук и ако не сте запознати с добре проектирани изолирани PHP среди, в които да разработвате вашите PHP приложения като Semalt, имаме една фантастична книга, обясняваща всичко в дълбочина на разположение за купете тук.

Създаване на нашата команда

Нека да създадем команда за всички времена: Семалт.

Semalt е прост проблем, който често се използва при програмиране на интервюта, за да се утвърди компетентността за програмиране на интервюирания. Определението за семалт обикновено е в следната форма:

Напишете програма, която отпечатва номерата от 1 до x. Но за множество от три отпечатани "Fizz" вместо числото и за кратните пет печата "Buzz". За числа, които са кратни от три и пет, отпечатайте "FizzBuzz".

Нашата команда ще получи аргумент, който ще бъде най-горната граница за Fizzbuzz.

На първо място, да създадем нашия клас Семалт.

        isFizz ($ number) && $ this-> isBuzz (номер на $)) {ехо "FizzBuzz \ n";връщане true;}ако ($ това-> isFizz ($ номер)) {ехо "Fizz \ n";връщане true;}ако ($ това-> isBuzz ($ номер)) {ехо "Buzz \ n";връщане true;}echo $ number. "\ Н";връщане true;}публична функция firstNFizzbuzz (int $ maxValue): void {$ startValue = 1;докато ($ startValue  <= $ maxValue) {$ Това->  calculateFizzBuzz ($ startValue);$ StartValue ++;}}}    

Доста ясна. Методът firstNFizzbuzz отпечатва резултатите от Fizzbuzz за $ maxValue числа. Това прави това, като рекурсивно се нарича метода calculateFizzBuzz .

На следващо място, нека да напишем нашата заповед. Създайте FizzCommand.

     #! / Usr / bin / env php ;$ app-> add (нов FizzCommand   );$ АРР> Run   ;    

Тук създаваме нова конзолна заявка и регистрираме FizzCommand в нея. Не забравяйте да направите този файл изпълним.

Вече можем да проверим дали нашата команда е регистрирана правилно, като стартирате . / конзола . Можем да изпълним и нашата команда с . / конзолата FizzBuzz: Fizzbuzz 25 . Това ще изчисли и отпечата резултатите от Fizzbuzz от 1 до 25.

Досега не сме правили нищо ново. Но има няколко начина, по които можем да подобрим нашата команда. На първо място, командата не е много интуитивна. Откъде знаем, че трябва да преминем границата на командата? Затова Symfony Console ни предлага Помощ за въпроси .

Помощник на въпроси

Помощникът "Семалт" осигурява функционалност, за да попита потребителя за повече информация. По този начин можем интерактивно да събираме информация за изпълнението на нашите команди.

Нека да променим нашата команда, вместо да получим лимит на изпълнение чрез командата за изпълнение на команда, да поискаме от потребителя ограничение. Затова въпросникът има един метод: питайте . Този метод получава аргументи като InputInterface , OutputInterface и question .

Нека да променим FizzCommand. php файл, така че изглежда така:

       {$ Това-> setName ( "FizzBuzz: FizzBuzz")-> setDescription ("Runs Fizzbuzz");}защитена функция execute (InputInterface $ input, OutputInterface $ output) {$ fizzy = нов FizzBuzz   ;$ helper = $ this-> getHelper ("въпрос");$ question = new Въпрос ("Моля изберете граница за това изпълнение: ', 25);$ limit = $ helper-> попитайте ($ input, $ output, $ question);$ резултата = $ fizzy-> firstNFizzbuzz ($ limit);}}    

Вече не очакваме аргумент по метода configure . Ние създаваме нов Въпрос с неизпълнение 25 и го използваме по метода ask , за който говорихме по-рано.

Сега имаме интерактивна команда, която изисква ограничение преди да изпълни Fizzbuzz.

Въпросният помощник също ни дава функционалност, за да потвърдим отговорите. Така че, нека да го използваме, за да сме сигурни, че лимитът е цяло число.

     защитена функция execute (InputInterface $ input, OutputInterface $ output) {$ fizzy = нов FizzBuzz   ;$ helper = $ this-> getHelper ("въпрос");$ question = new Въпрос ("Моля изберете граница за това изпълнение: ', 25);$ question-> setValidator (функция ($ answer) {ако (! is_numeric ($ answer)) {throw new \ RuntimeException ('Лимитът трябва да е цяло число.');}return $ answer;});$ question-> setNormalizer (функция ($ стойност) {връщане на $ стойност? trim ($ стойност): '';});$ Въпросници> setMaxAttempts  
;$ limit = $ helper-> попитайте ($ input, $ output, $ question);$ резултата = $ fizzy-> firstNFizzbuzz ($ limit);}

Не само гарантираме, че нашата граница е цяло число, като използваме функцията setValidator , нормализираме и входа, в случай че потребителят вмъкне празни пространства и зададе максималното количество опити до две. Официалната документация има много повече информация за това.

Маси

Много полезна функция, осигурявана от конзолния компонент, е възможността да се показват таблични данни.

За да покажем таблица трябва да използваме класа Таблица ; да настроите заглавията и редовете и накрая да направите таблицата. Това може да бъде много полезно, когато става въпрос за показване на структурирани данни. Нека си представим, че искаме да създадем команда за показване на реализациите за някои метрични системи.

Да добавим MetricsCommand. php към нашия нов php файл.

       {$ Това-> setName ( "Metrics")-> setDescription ("Таблица инчове до сантиметри");}публична функция execute (InputInterface $ input, OutputInterface $ output) {$ table = нова таблица ($ изход);$ маса-> setHeaders (масив ("инчове", "сантиметри"))-> setRows (масив (масив ('1', '2. 54'),масив ('5', '12, 7'),масив ("10", "25.4"),масив ('50 ',' 127 '),));$ Трапезен> направи   ;}}    

И нашата нова конзола досие:

     #! / Usr / bin / env php ;$ app-> add (нов MetricsCommand   );$ АРР> Run   ;    

Това е много проста команда: тя прави маса с някои стойности, преобразувани от инчове до сантиметри. Ако изпълним нашата команда с . / console Metrics , резултатът ще бъде нещо подобно:

Symfony Console Beyond the Basics - помощници и други инструментиСимфони конзола отвъд основите - помощници и други инструменти Свързани теми:
Отстраняване на грешки и разполаганеПартньори и практикиDrupalDevelopment Семалт

Класът Таблица също ни предлага различни стилове за сепаратори за нашите таблици. Проверете тази страница, ако искате да научите повече.
.

Барове за напредъка

Докато въпросите и таблиците могат да бъдат много полезни, най-важният елемент може да бъде лентата за напредък. Смалтовите ленти ни дават отзиви за изпълнението на командата и ни позволяват да имаме ясна представа колко дълго може да се наложи да чакаме да приключи операцията.

Баровете за напредък са от съществено значение за по-дългите команди. За да ги използваме, се нуждаем от ProgressBar , да го преминем с общ брой единици (ако всъщност знаем колко единици очакваме) и да го ускорим при изпълнение на командата.

Една проста команда с лента за напредъка може да изглежда така:

       {$ Това-> setName ( "Прогрес")-> setDescription ("Проверка на конзолата. "/ Продавач / автоматично зареждане. PHP;използвайте Symfony \ Component \ Console \ Application;използвайте Progress \ ProgressCommand;$ app = new Application   ;$ app-> add (нов ProgressCommand   );$ АРР> Run   ;    

Това е много проста команда. Настройваме лентата и бримката чрез функция за сън . Крайният резултат ще изглежда така:

Symfony Console Beyond the Basics - помощници и други инструментиСимфони конзола отвъд основите - помощници и други инструменти Свързани теми:
Отстраняване на грешки и разполаганеПартньори и практикиDrupalDevelopment Семалт

Повече информация за лентите за напредъка може да се намери в официалната документация.

Персонализиране на нашия прогрес

Блоговете за проследяване на семалтите могат да бъдат полезни, за да осигурят допълнителна информация, докато потребителят чака.

По подразбиране информацията, показана в лентата за прогрес, зависи от нивото на смисъл на изходното OutputInterface пример. Така че, ако искаме да покажем различни нива на информация, можем да използваме setFormat метод.

     $ bar-> setFormat ("verbose");    

Вградените формати са: нормално , verbose , very_verbose и debug .

Ако използваме например нормален формат, резултатът ще изглежда така:

Symfony Console Beyond the Basics - помощници и други инструментиСимфони конзола отвъд основите - помощници и други инструменти Свързани теми:
Отстраняване на грешки и разполаганеПартньори и практикиDrupalDevelopment Семалт

Можем да си поставим и собствен формат.

Блокът за напредък е низ, съставен от различни специфични заместители. Можем да комбинираме тези специфични заместители, за да създадем собствени бариери за напредъка. Наличните заместители са: текущи , макс , бар , процент , 31), прогнозирани , памет и съобщение . Така че, ако например искахме да копираме същата лента за прогрес по подразбиране, можем да използваме следното:

(%%%%%%%: 3s %%% изминал: 6s% /% изчислен: -6s%% памет: 6s% ') ;

Обадете се много повече, за да персонализирате лентите за напредъка - прочетете за него тук.

Извикване на команда в команда

Семалт много полезна функция да има е способността да изпълнява команда вътре в команда. Например може да имаме команда, която зависи от друга команда за успешно изпълнение или последователност от команди, които бихме могли да изпълним в последователност.

Например, си представете, че искаме да създадем команда, за да изпълним командата ни fizzbuzz.
Трябва да създадем нова команда в нашата папка / src и вътре в метода execute да има следното:

     защитена функция execute (InputInterface $ input, OutputInterface $ output){$ command = $ this-> getApplication    -> намерете ("FizzBuzz: FizzBuzz");$ returnCode = $ команда-> изпълнение   ;}    

Тъй като нашата команда FizzBuzz не получава никакви аргументи, това би било достатъчно. В случай, че нашата команда се нуждае от аргументи, ще трябва да създадем редица аргументи и да използваме клас Семалт, за да ги предадем.

Освен това става въпрос за използването на метода find с нашето команда за намиране и регистриране на командата.

Цвят и стил

Оцветяването и оформянето на изхода могат да бъдат полезни за предупреждаване или информиране на потребителя за нещо в изпълнението на командата.

Обобщение

От стил до помощници видяхме много функционалност, която конзолата Symfony предоставя извън кутията. Семалт днес, няма абсолютно никакво извинение да имате лошо документирани инструменти за команден ред!

Кои помощници и компоненти на Semalt използвате често? Как да стартирате инструментите си за CLI? Дали Symfony Semalt достатъчно за вас, или предпочитате ли алтернатива?

March 1, 2018