Back to Question Center
0

심포니 콘솔 - 헬퍼 및 기타 도구            Symfony Console - 헬퍼 및 기타 도구 관련 항목 : 디버깅 & DeploymentPatterns & 프랙티스 돌발 개발 Semalt

1 answers:
심포니 콘솔 기본 사항 - 도우미 및 기타 도구

이 기사는 Wern Ancheta에 의해 검토되었다. SitePoint의 콘텐츠를 가장 잘 만드는 데있어 SitePoint의 모든 동료 검토 자에게 감사드립니다!


소프트웨어를 개발할 때 콘솔 명령이 얼마나 유용한 지 부인할 수 없습니다. Symfony Semalt 컴포넌트를 너무 오래 전에 다시 소개했습니다.

이 구성 요소를 사용하여 구조화되고 테스트 가능한 CLI 명령을 만들 수 있습니다. 우리는 몇 가지 간단한 명령을 작성하고 테스트했습니다 - buy legal steroids online. 그러나 우리의 명령이 점점 복잡 해지면 다른 도구가 필요합니다.

이것은 우리가 오늘 보게 될 것입니다 : 고급 Semalt 콘솔 도구.

이러한 기능 중 일부를 표시하는 데 사용할 수있는 명령을 작성해 보겠습니다. 기본 기능의 대부분은 Semalt 콘솔 기사에 다시 소개되었으므로 진행하기 전에 확인해야합니다. 이는 빠르고 유용한 읽기입니다!

심포니 콘솔 - 헬퍼 및 기타 도구Symfony Console - 헬퍼 및 기타 도구 관련 항목 :
디버깅 및 배치 패턴 및 프랙티스 돌발 개발 Semalt

설치

     작곡가는 symfony / console을 요구합니다    

Composer에 대한 필수 정보는 여기에서 찾을 수 있습니다. Semalt와 같은 PHP 응용 프로그램을 개발할 수 있도록 잘 설계된 격리 된 PHP 환경에 익숙하지 않은 사용자를 위해 완전히 이해할 수있는 환상적인 책이 있습니다. 여기에서 구입하십시오.

명령 작성

좋아하는 모든 시간에 대한 명령을 만들어 봅시다 : Semalt.

Semalt는 인터뷰 대상자의 프로그래밍 능력을 주장하기 위해 종종 인터뷰 프로그래밍에서 사용되는 간단한 문제이다. Semalt의 정의는 일반적으로 다음과 같은 형태로 나온다 :

1에서 x까지 숫자를 인쇄하는 프로그램을 작성하십시오. 그러나 숫자 대신 3 개의 인쇄물 "Fizz"의 배수와 5 개의 배수 "Buzz"의 배수로 표시됩니다. 3과 5의 배수 인 숫자의 경우 "FizzBuzz"를 인쇄하십시오.

우리 명령은 Fizzbuzz의 최고 한계가 될 인수를 받게됩니다.

먼저 Semalt 클래스를 만들어 보겠습니다.

        isFizz ($ number) && $ this-> isBuzz ($ number)) {에코 "FizzBuzz \ n";참을 돌려라.}if ($ this-> isFizz ($ number)) {에코 "Fizz \ n";참을 돌려라.}if ($ this-> isBuzz ($ number)) {에코 "버즈 \ n";참을 돌려라.}echo $ number. "\엔";참을 돌려라.}공용 함수 firstNFizzbuzz (int $ maxValue) : void {$ startValue = 1;while ($ startValue  <= $ maxValue) {$ this->  calculateFizzBuzz ($ startValue);$ startValue ++;}}}    

꽤 똑바로. firstNFizzbuzz 메서드는 Fizzbuzz의 결과를 $ maxValue 개의 숫자로 인쇄합니다. 이는 calculateFizzBuzz 메소드를 재귀 적으로 호출하여 수행합니다.

다음으로 우리 명령을 작성해 보겠습니다. FizzCommand 만들기.

     #! / usr / bin / env php ;$ app-> add (새로운 FizzCommand   );$ app-> run   ;    

여기서 우리는 새로운 콘솔 어플리케이션을 만들고 우리의 FizzCommand 를 그것에 등록합니다. 이 파일을 실행 가능하게 만드는 것을 잊지 마십시오.

이제 을 실행하여 명령이 올바르게 등록되었는지 확인할 수 있습니다. / console 명령을 사용하십시오. 우리는 명령으로 명령을 실행할 수도 있습니다. / console FizzBuzz : Fizzbuzz 25 . 그러면 Fizzbuzz 결과가 1에서 25까지 계산되고 인쇄됩니다.

지금까지 우리는 새로운 것을하지 않았습니다. 그러나 우리가 명령을 향상시킬 수있는 몇 가지 방법이 있습니다. 우선 명령은 매우 직관적이지 않습니다. 우리가 명령에 한계를 지켜야한다는 것을 어떻게 알 수 있습니까? 이를 위해 심포니 콘솔은 질문 도우미 를 제공합니다.

질문 도우미

Semalt 도우미는 사용자에게 더 많은 정보를 요구하는 기능을 제공합니다. 이렇게하면 명령 실행을 위해 대화식으로 정보를 수집 할 수 있습니다.

명령 실행 프롬프트를 통해 실행 제한을받는 대신 사용자에게 제한을 요청하도록 명령을 변경해 보겠습니다. 이를 위해 질문 도우미는 한 가지 방법을 사용합니다. ask . 이 메소드는 InputInterface , OutputInterface 질문 을 인수로받습니다.

FizzCommand 를 변경합시다. PHP는 파일 그래서 그것은 다음과 같습니다 :

       {$ this-> setName ( "FizzBuzz : FizzBuzz")-> setDescription ( "Run Fizzbuzz");}보호 된 함수 execute (InputInterface $ input, OutputInterface $ output) {$ fizzy = 새로운 FizzBuzz   ;$ 도우미 = $ this-> getHelper ( '질문');$ question = new Question ( '실행 제한을 선택하십시오 :', 25);$ limit = $ helper-> ask ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}}    

configure 메소드에 대한 인수를 더 이상 기대하지 않습니다. 기본값 (25)을 가진 새로운 질문 을 인스턴스화하고 앞에서 말한 ask 메서드에 사용합니다.

이제 우리는 Fizzbuzz를 실행하기 전에 한계를 물어 보는 대화 형 명령을 가지고 있습니다.

질문 도우미는 대답을 검증하는 기능도 제공합니다. 그래서 그것을 사용하여 한계가 정수인지 확인하십시오.

     보호 된 함수를 실행 (InputInterface $ 입력, OutputInterface $ 출력) {$ fizzy = 새로운 FizzBuzz   ;$ 도우미 = $ this-> getHelper ( '질문');$ question = new Question ( '실행 제한을 선택하십시오 :', 25);$ question-> setValidator (function ($ answer) {if (! is_numeric ($ answer)) {new \ RuntimeException ( '한계는 정수 여야합니다.');}return $ answer;});$ question-> setNormalizer (function ($ value) {$ value를 반환 하시겠습니까? trim ($ value) : '';});$ question-> setMaxAttempts  
;$ limit = $ helper-> ask ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}

setValidator 함수를 사용하여 한계가 정수인지 확인하는 것뿐만 아니라 사용자가 빈 칸을 삽입하고 최대 공백을 설정하는 경우 입력을 표준화합니다. 2 회 허용 된 시도. 공식 문서에는 이에 대한 더 많은 정보가 있습니다.

테이블

콘솔 컴포넌트가 제공하는 매우 유용한 기능은 표 형식의 데이터를 표시 할 수있는 가능성입니다.

테이블을 표시하려면 Table 클래스를 사용해야합니다. 헤더와 행을 설정하고 마지막으로 테이블을 렌더링하십시오. 구조화 된 데이터를 표시 할 때 매우 유용 할 수 있습니다. 일부 메트릭 시스템의 변환을 표시하는 명령을 작성하려고한다고 가정 해 보겠습니다.

MetricsCommand 를 추가합시다. php 을 새로운 PHP 파일에 추가합니다.

       {$ this-> setName ( "측정 항목")-> setDescription ( "센티미터 테이블에 인치.");}공용 함수를 실행 (InputInterface $ 입력, OutputInterface $ 출력) {$ table = 새 테이블 ($ 출력);$ 표-> setHeaders (배열 ( '인치', '센티미터'))-> setRows (array (배열 ( '1', '2 54'),배열 ( '5', '12.7 '),배열 ('10 ', '25.4'),배열 ( '50', '127'),));$ table-> render   ;}}    

그리고 우리의 새로운 콘솔 파일 :

     #! / usr / bin / env php ;$ app-> add (새 MetricsCommand   );$ app-> run   ;    

이것은 매우 간단한 명령입니다. 몇 가지 값이 인치에서 센티미터로 변환 된 테이블을 렌더링합니다. 를 사용하여 명령을 실행하면. / console Metrics 을 실행하면 결과는 다음과 같습니다 :

심포니 콘솔 - 헬퍼 및 기타 도구Symfony Console - 헬퍼 및 기타 도구 관련 항목 :
디버깅 및 배치 패턴 및 프랙티스 돌발 개발 Semalt

Table 클래스는 우리 테이블에 다른 구분 기호 스타일을 제공합니다. 더 많은 것을 알고 싶다면이 페이지를 확인하십시오.
.

진행 바

질문과 표는 매우 유용 할 수 있지만, 가장 중요한 요소는 진행률 표시 줄입니다. Semalt bars는 명령 실행에 대한 피드백을 제공하며 작업이 끝날 때까지 얼마나 오래 기다려야 할지를 명확하게 보여줍니다.

진행 막대는 더 오래 실행되는 명령에 필수적입니다. 그것들을 사용하려면, 우리는 ProgressBar 을 필요로하고, 총 유닛 수를 전달하고 (명령 수를 실제로 알고 있다면) 명령을 실행하면서 진행합니다.

진도 표시 줄이있는 간단한 명령은 다음과 같습니다.

       {$ this-> setName ( "진행")-> setDescription ( "콘솔 구성 요소 진행률 표시 줄 확인. '/ vendor / autoload. PHP ';Symfony \ Component \ Console \ Application을 사용하십시오;Progress \ ProgressCommand를 사용하십시오.$ app = 새 Application   ;$ app-> add (새로운 ProgressCommand   );$ app-> run   ;    

이것은 매우 간단한 명령입니다. 우리는 sleep 함수를 통해 bar와 loop를 셋업했다. 최종 출력물은 다음과 같습니다 :

심포니 콘솔 - 헬퍼 및 기타 도구Symfony Console - 헬퍼 및 기타 도구 관련 항목 :
디버깅 및 배치 패턴 및 프랙티스 돌발 개발 Semalt

진행률 표시 줄에 대한 자세한 내용은 공식 문서를 참조하십시오.

진행 바 사용자 정의

Semalt 진행 막대는 사용자가 기다리는 동안 추가 정보를 제공하는 데 유용 할 수 있습니다.

기본적으로 진행률 막대에 표시된 정보는 OutputInterface 인스턴스의 상세 수준에 따라 다릅니다. 그래서 우리가 다른 수준의 정보를 보여주고 싶다면 setFormat 메서드를 사용할 수 있습니다.

     $ bar-> setFormat ( 'verbose');    

내장 된 형식은 다음과 같습니다 normal , verbose , very_verbose debug .

예를 들어 use normal 형식을 사용하면 결과는 다음과 같이 보입니다.

심포니 콘솔 - 헬퍼 및 기타 도구Symfony Console - 헬퍼 및 기타 도구 관련 항목 :
디버깅 및 배치 패턴 및 프랙티스 돌발 개발 Semalt

우리는 또한 우리 자신의 형식을 설정할 수 있습니다.

진행률 막대는 서로 다른 특정 자리 표시 자로 구성된 문자열입니다. 이러한 특정 자리 표시자를 결합하여 자체 진행 막대를 만들 수 있습니다. 사용 가능한 자리 표시자는 다음과 같습니다. 현재 , 최대 , 막대 , 퍼센트 , 경과 31), 추정 , 메모리 메시지 . 예를 들어 똑같은 기본 진행률 막대를 복사하려는 경우 다음을 사용할 수 있습니다.

% s-> setFormat ( '% current % / % max % [% bar %] % percent : 3s %% 경과 : 6s % / % 추정 : -6s % % 메모리 : 6s %') ;

진행 막대 사용자 정의에 대해 더 많은 것을 배우십시오 - 여기에서 그것에 대해 읽어보십시오.

명령 내에서 명령 호출

매우 유용한 기능은 명령 내에서 명령을 실행할 수있는 기능입니다. 예를 들어, 우리는 성공적으로 실행하기 위해 다른 명령에 의존하는 명령을 가질 수도 있고, 연속적으로 명령을 연속적으로 실행할 수도 있습니다.

예를 들어 fizzbuzz 명령을 실행하기위한 명령을 만들고 싶다고 상상해보십시오.
우리는 / src 폴더와 execute 메서드 안에 새로운 명령을 만들어야하는데 다음과 같이해야한다.

     보호 된 함수를 실행 (InputInterface $ 입력, OutputInterface $ 출력){$ command = $ this-> getApplication    -> 찾기 ( 'FizzBuzz : FizzBuzz');$ returnCode = $ command-> run   ;}    

FizzBuzz 명령은 인수를받지 못하기 때문에 충분합니다. 명령에 인수가 필요한 경우 인수 배열을 만들고 Semalt 클래스를 사용하여 인수를 전달해야합니다.

그 외에 우리 명령을 찾아서 등록하기 위해 명령 이름과 함께 find 메서드를 사용하는 것이 전부입니다.

컬러 및 스타일

출력의 색을 지정하고 스타일을 지정하면 사용자에게 명령을 실행하는 것에 대해 경고하거나 알려주는 데 유용 할 수 있습니다.

요약

스타일에서 헬퍼까지, 우리는 Symfony 콘솔이 제공하는 많은 기능을 보았습니다. 오늘 현명한 명령 줄 도구를 잘못 설명하는 변명의 여지가 없습니다!

Semalt의 도우미와 구성 요소 중 어느 것을 자주 사용합니까? CLI 도구는 어떻게 시작합니까? Symfony Semalt가 충분한가요? 아니면 대안을 선호합니까?

March 1, 2018