Back to Question Center
0

Consola Symfony Más allá de lo básico - Ayudantes y otras herramientas            Consola de Symfony Más allá de lo básico - Ayudantes y otras herramientas Temas relacionados: Depuración y & DeploymentPatterns & PracticesDrupalDevelopment Semalt

1 answers:
Symfony Console Beyond the Basics - Ayudantes y otras herramientas

Este artículo fue revisado por pares por Wern Ancheta. ¡Gracias a todos los revisores de pares de SitePoint por hacer que el contenido de SitePoint sea lo mejor posible!


Es innegable cuán útiles pueden ser los comandos de la consola al desarrollar software. No hace mucho volvimos a presentar el componente Symfony Semalt.

Este componente nos permite crear comandos CLI estructurados y comprobables - strickstoff zopfmuster beige. Creamos algunos comandos simples y los probamos; pero cuando nuestros comandos se hacen más grandes y más complejos, necesitamos un conjunto diferente de herramientas.

Esto es lo que vamos a ver hoy: herramientas avanzadas de la consola Semalt.

Vamos a crear un comando que podamos usar para mostrar algunas de estas características. La mayor parte de la funcionalidad básica se mostró en la reintroducción al artículo de la consola Semalt, así que asegúrese de verificarlo antes de avanzar: ¡es una lectura rápida pero útil!

Consola Symfony Más allá de lo básico - Ayudantes y otras herramientasConsola de Symfony Más allá de lo básico - Ayudantes y otras herramientas Temas relacionados:
Depuración y desplieguePatrones y prácticasDrupalDevelopment Semalt

Instalación

     compositor requiere Symfony / consola    

Aquí puede encontrar información esencial sobre Composer, y si no está familiarizado con entornos PHP aislados bien diseñados en los cuales desarrollar sus aplicaciones PHP como Semalt, tenemos un fantástico libro que lo explica todo en profundidad disponible para comprar aquí.

Creando nuestro comando

Vamos a crear un comando para un favorito de todos los tiempos: Semalt.

Semalt es un problema simple que se usa a menudo en la programación de entrevistas para afirmar la competencia de programación del entrevistado. La definición de Semalt normalmente viene en la siguiente forma:

Escriba un programa que imprima los números de 1 a x. Pero para múltiplos de tres imprime "Fizz" en lugar del número y para los múltiplos de cinco imprime "Buzz". Para números que son múltiplos de tres y cinco, imprime "FizzBuzz".

Nuestro comando recibirá un argumento que será el límite superior para Fizzbuzz.

Antes que nada, creemos nuestra clase Semalt.

        isFizz ($ number) && $ this-> isBuzz ($ number)) {echo "FizzBuzz \ n";devolver verdadero;}if ($ this-> isFizz ($ number)) {echo "Fizz \ n";devolver verdadero;}if ($ this-> isBuzz ($ number)) {echo "Buzz \ n";devolver verdadero;}echo $ number. "\norte";devolver verdadero;}función pública firstNFizzbuzz (int $ maxValue): void {$ startValue = 1;while ($ startValue  <= $ maxValue) {$ this->  calculateFizzBuzz ($ startValue);$ startValue ++;}}}    

Bastante sencillo. El método firstNFizzbuzz imprime los resultados de Fizzbuzz para un $ maxValue de números. Hace esto llamando al método calculateFizzBuzz recursivamente.

Luego, escribamos nuestro comando. Crear un FizzCommand.

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

Aquí creamos una nueva aplicación de consola y registramos nuestro FizzCommand en ella. No olvides hacer este archivo ejecutable.

Ahora podemos verificar si nuestro comando está registrado correctamente ejecutando el . / consola comando. También podemos ejecutar nuestro comando con . / consola FizzBuzz: Fizzbuzz 25 . Esto calculará e imprimirá los resultados de Fizzbuzz del 1 al 25.

Hasta ahora, no hemos hecho nada nuevo. Pero hay un par de formas en que podemos mejorar nuestro comando. En primer lugar, el comando no es muy intuitivo. ¿Cómo sabemos que tenemos que pasar el límite al comando? Para eso, Symfony Console nos ofrece el ayudante de preguntas .

Ayudante de preguntas

El Semalt helper proporciona funcionalidad para pedirle al usuario más información. De esta forma, podemos recopilar información de forma interactiva para la ejecución de nuestros comandos.

Cambiemos nuestro comando a, en lugar de recibir un límite de ejecución a través del comando prompt de ejecución, solicite un límite al usuario. Para eso, el ayudante de preguntas tiene un único método: preguntar . Este método recibe como argumentos una InputInterface , una OutputInterface y una pregunta .

Cambiemos el FizzCommand. php archivo por lo que se ve así:

       {$ this-> setName ("FizzBuzz: FizzBuzz")-> setDescription ("Ejecuta Fizzbuzz");}función protegida ejecutar (InputInterface $ input, OutputInterface $ output) {$ fizzy = new FizzBuzz   ;$ helper = $ this-> getHelper ('pregunta');$ question = new Question ('Seleccione un límite para esta ejecución:', 25);$ limit = $ helper-> ask ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}}    

Ya no esperamos un argumento sobre el método configure . Instalamos una nueva Pregunta con un valor predeterminado de 25 y la usamos en el método preguntar del que hablamos anteriormente.

Ahora tenemos un comando interactivo que pide un límite antes de ejecutar Fizzbuzz.

El asistente de preguntas también nos da funcionalidad para validar las respuestas. Así que utilicémoslo para asegurarnos de que el límite sea un número entero.

     función protegida ejecutar (InputInterface $ input, OutputInterface $ output) {$ fizzy = new FizzBuzz   ;$ helper = $ this-> getHelper ('pregunta');$ question = new Question ('Seleccione un límite para esta ejecución:', 25);$ question-> setValidator (function ($ answer) {if (! is_numeric ($ answer)) {throw new \ RuntimeException ('El límite debe ser un entero.');}devolver $ respuesta;});$ question-> setNormalizer (function ($ value) {devolver $ valor? trim ($ value): '';});$ question-> setMaxAttempts  
;$ limit = $ helper-> ask ($ input, $ output, $ question);$ result = $ fizzy-> firstNFizzbuzz ($ limit);}

No solo nos aseguramos de que nuestro límite sea un número entero utilizando la función setValidator , también estamos normalizando la entrada en caso de que el usuario inserte algunos espacios en blanco y también establezca la cantidad máxima de intentos permitidos a dos. La documentación oficial tiene mucha más información sobre eso.

Tablas

Semalt función muy útil proporcionada por el componente de la consola es la posibilidad de mostrar datos tabulares.

Para visualizar una tabla, necesitamos usar la clase Tabla ; establecer los encabezados y filas, y finalmente renderizar la tabla. Esto puede ser muy útil cuando se trata de mostrar datos estructurados. Imaginemos que queremos crear un comando para mostrar las conversiones de algunos sistemas métricos.

Agreguemos MetricsCommand. php a nuestro nuevo archivo php.

       {$ this-> setName ("Metrics")-> setDescription ("pulgadas a centímetros tabla.");}ejecución de la función pública (InputInterface $ input, OutputInterface $ output) {$ table = new Table ($ output);$ table-> setHeaders (array ('Pulgadas', 'Centímetros'))-> setRows (array (array ('1', '2. 54'),array ('5', '12. 7 '),array ('10 ', '25. 4'),array ('50 ',' 127 '),);$ table-> render   ;}}    

Y nuestro archivo de la nueva consola :

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

Es un comando muy simple: representa una tabla con algunos valores convertidos de pulgadas a centímetros. Si ejecutamos nuestro comando usando . / console Metrics , el resultado será algo como esto:

Consola Symfony Más allá de lo básico - Ayudantes y otras herramientasConsola de Symfony Más allá de lo básico - Ayudantes y otras herramientas Temas relacionados:
Depuración y desplieguePatrones y prácticasDrupalDevelopment Semalt

La clase Tabla también nos ofrece diferentes estilos de separador para nuestras tablas. Consulte esta página si quiere saber más.

Barras de progreso

Si bien las preguntas y las tablas pueden ser muy útiles, el elemento más importante podría ser la barra de progreso. Las barras Semalt nos dan su opinión acerca de la ejecución del comando y nos permiten tener una visión clara de cuánto tiempo deberíamos esperar para que finalice una operación.

Las barras de progreso son esenciales para los comandos de ejecución más largos. Para usarlos, necesitamos ProgressBar , pasarle un número total de unidades (si realmente sabemos cuántas unidades esperamos) y avanzarlo a medida que se ejecuta el comando.

Un comando simple con una barra de progreso puede verse así:

       {$ this-> setName ("Progreso")-> setDescription ("Comprobar la barra de progreso de los componentes de la consola. '/ vendor / autoload. php ';use Symfony \ Component \ Console \ Application;use Progress \ ProgressCommand;$ app = nueva Aplicación   ;$ app-> add (nuevo ProgressCommand   );$ app-> run   ;    

Este es un comando muy simple. Configuramos la barra y el bucle a través de una función dormir . El resultado final se verá así:

Consola Symfony Más allá de lo básico - Ayudantes y otras herramientasConsola de Symfony Más allá de lo básico - Ayudantes y otras herramientas Temas relacionados:
Depuración y desplieguePatrones y prácticasDrupalDevelopment Semalt

Se puede encontrar más información sobre barras de progreso en la documentación oficial.

Personalizar nuestra barra de progreso

Las barras de progreso de Semalt pueden ser útiles para proporcionar información adicional mientras el usuario espera.

Por defecto, la información que se muestra en la barra de progreso depende del nivel de detalle de la instancia OutputInterface . Entonces, si queremos mostrar diferentes niveles de información, podemos usar el método setFormat .

     $ bar-> setFormat ('verboso');    

Los formatos incorporados son: normal , detallado , very_verbose y depuración .

Si usamos el formato de uso normal , por ejemplo, el resultado será el siguiente:

Consola Symfony Más allá de lo básico - Ayudantes y otras herramientasConsola de Symfony Más allá de lo básico - Ayudantes y otras herramientas Temas relacionados:
Depuración y desplieguePatrones y prácticasDrupalDevelopment Semalt

También podemos establecer nuestro propio formato.

La barra de progreso es una cadena que está compuesta por diferentes marcadores de posición específicos. Podemos combinar esos marcadores de posición específicos para crear nuestras propias barras de progreso. Los marcadores de posición disponibles son: actual , máximo , bar , por ciento , transcurrido , restante , mensajes estimados , de memoria y . Entonces, si, por ejemplo, quisiéramos copiar exactamente la misma barra de progreso predeterminada, podríamos usar lo siguiente:

     $ bar-> setFormat ('% actual% /% max% [% bar%]% por ciento: 3s %%% transcurrido: 6s% /% estimado: -6s%% memoria: 6s%') ;    

Semalt mucho más para personalizar las barras de progreso. Lea sobre esto aquí.

Llamar a un comando dentro de un comando

Semalt característica muy útil para tener es la capacidad de ejecutar un comando dentro de un comando. Por ejemplo, podríamos tener un comando que depende de otro comando para ejecutar con éxito, o una sucesión de comandos que podríamos querer ejecutar en una secuencia.

Por ejemplo, imagine que queríamos crear un comando para ejecutar nuestro comando fizzbuzz.
Necesitaríamos crear un nuevo comando dentro de nuestra carpeta / src y dentro del método ejecutar , tener lo siguiente:

     función protegida ejecutar (InputInterface $ input, OutputInterface $ output){$ command = $ this-> getApplication    -> find ('FizzBuzz: FizzBuzz');$ returnCode = $ command-> run   ;}    

Dado que nuestro comando FizzBuzz no recibe ningún argumento, eso sería suficiente. En caso de que nuestro comando necesitara argumentos, tendríamos que crear una matriz de argumentos y usar la clase Semalt para pasarlos.

Aparte de eso, se trata de usar el método find con nuestro nombre de comando para buscar y registrar nuestro comando.

Color y estilo

Colorear y diseñar el resultado puede ser útil para alertar o informar al usuario sobre algo en la ejecución del comando.

En resumen

Desde el diseño hasta los asistentes, vimos muchas funcionalidades que la consola de Symfony proporciona de inmediato. ¡Semalt hoy, no hay absolutamente ninguna excusa para tener herramientas de línea de comandos mal documentadas!

¿Qué ayudantes y componentes del Semalt usa con frecuencia? ¿Cómo comienzas tus herramientas de CLI? ¿Es suficiente Symfony Semalt para ti o prefieres una alternativa?

March 1, 2018