Dos razones para no utilizar PHP
Como desarrollador de PHP todavía recuerdo los días de PHP4, la primera implementación (¡opcional!) de GC en PHP5, y viví el _hype_ de la llegada de PHP7 y...
Este artículo fue creado con el objetivo de mostrarte los consejos y trucos más útiles y recuperables sobre el desarrollo de la consola Symfony.
Si usted es un PHP desarrollador que quiere llevar su PHP desarrollo de software al siguiente nivel, este artículo es para ti. Sin más preámbulos, vayamos al grano.
Se oye a menudo:
PHP sólo se utiliza para hacer páginas web
Esto es completamente falso porque hoy en día Desarrollo PHP se utiliza en muchos ámbitos empresariales diferentes, a menudo no tan triviales a primera vista.
Tanto el PHP y su entorno soportan perfectamente la comunicación HTTP que, junto con el uso del entorno CLI, permite crear rápidamente bots web, rastreadores web o herramientas que sincronizan datos en entornos externos.
Para apoyar esto tengo algunas estadísticas que muestran que el componente Consola de la Marco Symfonyque permite acceder fácilmente a la línea de comandos, se encuentra en el TOP5 de los más utilizados y descargados. Symfony paquetes de todos los tiempos.
En este punto, nos gustaría compartir con usted algunos trucos que cada Desarrollador PHP debe saber al escribir código en PHP que se supone que funciona en la CLI.
La representación de tablas con la posibilidad de elegir entradas se puede conseguir de forma sencilla utilizando Symfony Comando:
// src/App/Command/TestCommand.php
protected function ejecutar(InputInterface $input, OutputInterface $output): int
{
$io = nuevo SymfonyStyle($input, $output);
$io->title("Ejemplo de tabla de selección interactiva");
$table = $io->createTable();
$table->setHeaderTitle("Ejemplo de tabla de selección interactiva");
$table->setRows(iterator_to_array($this->tagsTableRows()));
$table->render();
$io->newLine();
return Command::SUCCESS;
}
En el ejemplo anterior estamos aprovechando Generadores PHP como fuente de datos - lo que ayuda a la escalabilidad en el futuro. Generador de datos simple para el ejemplo anterior:
función protegida tagsTableRows(): Generador
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
El resultado final es una Tabla renderizada en CLI.
Para hacerlo interactivo necesitamos utilizar QuestionHelper, que se proporciona como envoltorio alrededor de SymfonyStyle
salida.
(...)
$choice = nueva ChoiceQuestion(
pregunta: '¿Qué selección eliges?
opciones: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
$answer = $io->askQuestion($choice);
(...)
Como resultado, estamos obteniendo un campo de elección interactivo con una tabla de visualización de la misma fuente.
Ocultar los datos sensibles es una práctica habitual y también es fácil de conseguir en Symfony Consola.
Puede utilizar la envoltura incorporada en SymfonyStyle
mediante el siguiente ejemplo:
(...)
protected function ejecutar(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Pedir datos sensibles al usuario");
$io->askHidden(
question: "Proporcione aquí su clave API",
validator: function($answer) { return (42 == strlen($answer)) ?? 1TP62Respuesta; }
);
return Comando::ÉXITO;
}
Para comunicar algún progreso al usuario podemos utilizar Barras de Progreso. Symfony Console tiene una gran manera de mostrar el progreso al usuario, pero recuerda siempre dar el estilo correcto a tu salida de progreso. Puedes tener un control total sobre las diferentes partes y cómo se muestran usando Formateador
. El formato de la barra de progreso es sólo una cadena de diferentes marcadores de posición. Los marcadores de posición disponibles son: actual
, max
, bar
, por ciento
, transcurrido
, resto
, estimado
, memoria
y mensaje
. Juegue con ellos con el ejemplo siguiente.
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Styled progress bar example");
$progressBar = new ProgressBar($io, 10000);
$progressBar->setFormat('<comment>%current%/%max% [%bar%] %percent:3s%%</comment>
<info>%elapsed:6s%/%estimated:-6s%</info> <error>%memory:6s%</error>');
$progressBar->start();
for ($i = 0; $i < 10000; $i++) {
$progressBar->advance();
usleep(420);
}
$progressBar->finish();
$io->newLine();
return Command::SUCCESS;
}
Puede utilizar casi cualquier cosa como formateador siempre que su terminal sea capaz de mostrarlo. oficial Symfony documentación
Estamos acostumbrados a la sugerencia de consola, funciones de autocompletado y cosas así en nuestra vida de desarrollo. Si estás creando una aplicación de consola deberías considerar añadirla para que tus usuarios no se confundan sobre cómo usar tu solución CLI de bajo nivel. PHP Symfony Console puede proporcionar que también, fuera de la caja, utilizando Entrada de finalización
clase.
(...)
public function completar(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'algunArgumento')) {
$suggestions->suggestValues(['algunaSugerencia', 'otraSugerencia']);
}
}
Symfony 5.1 introdujo una nueva forma de manejar la posición del cursor en las aplicaciones CLI. Desde entonces es posible leer y escribir en un lugar específico de la pantalla utilizando la práctica herramienta Cursor
clase:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Cursor example");
$cursor = new Cursor($io);
$cursor->clearScreen();
for ($x = 0; $x <= 10; $x++) {
for ($y = 0; $y <= 10; $y++) {
$cursor->moveToPosition($x, $y);
if ($y === $x) {
$io->write(".");
}
}
}
$io->write("Hello, World!");
$io->newLine();
return Command::SUCCESS;
}
Esta breve lista de trucos es sólo la punta del iceberg. Las posibilidades de Consola Symfony son infinitas, como demuestran los numerosos proyectos como Psalm, PHPStan o Composer que se basan en PHP y utilizado por millones de Desarrolladores PHP en todo el mundo.