Duas razões para não utilizar o PHP
Como desenvolvedor do PHP, ainda me lembro dos dias do PHP4, da primeira implementação (opcional!) do GC no PHP5, e vivi o _hype_ do advento do PHP7 e...
Este artigo foi criado com o objetivo de lhe mostrar as dicas e truques mais úteis e recuperáveis sobre o Symfony Console Development.
Se é um PHP criador que quer trazer o seu PHP desenvolvimento de software para o nível seguinte, este artigo é para si. Sem mais demoras, vamos diretos ao assunto.
Ouve-se muitas vezes:
O PHP só é utilizado para criar páginas Web
Isto é completamente falso porque hoje em dia Desenvolvimento do PHP é utilizado em muitos domínios de atividade diferentes, muitas vezes não tão triviais à primeira vista.
Tanto o PHP e o seu ambiente suportam perfeitamente a comunicação HTTP, o que, juntamente com a utilização do ambiente CLI, permite criar rapidamente web bots, web crawlers ou ferramentas que sincronizam dados em ambientes externos.
Para apoiar esta afirmação, tenho algumas estatísticas que mostram que a componente Consola do Estrutura Symfonyque permite o acesso fácil à linha de comando, está no TOP5 dos mais utilizados e descarregados Symfony pacotes de todos os tempos.

Neste momento, gostaríamos de partilhar consigo alguns truques que qualquer Desenvolvedor PHP deve saber ao escrever código em PHP que é suposto funcionar no CLI.

A renderização de tabelas com a capacidade de selecionar entradas pode ser conseguida de uma forma fácil utilizando Symfony Comando:
// src/App/Command/TestCommand.php
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Exemplo de tabela de seleção interactiva");
$table = $io->createTable();
$table->setHeaderTitle("Exemplo de tabela de seleção interactiva");
$table->setRows(iterator_to_array($this->tagsTableRows()));
$table->render();
$io->newLine();
return Command::SUCCESS;
}
No exemplo acima, estamos a tirar partido de PHP Geradores como fonte de dados - o que ajuda a escalabilidade no futuro. Gerador de dados simples para o exemplo acima:
protected function tagsTableRows(): Generator
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
O resultado final é uma tabela apresentada em CLI.

Para o tornar interativo, precisamos de utilizar o QuestionHelper, fornecido como um invólucro em torno de SymfonyStyle saída.
(...)
$choice = new ChoiceQuestion(
pergunta: "Que seleção escolheu?",
escolhas: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
$answer = $io->askQuestion($choice);
(...)
Como resultado, estamos a obter um campo de escolha interativo com uma apresentação de tabela a partir da mesma fonte.

Esconder o prompt enquanto fornece dados sensíveis é uma prática comum e também é facilmente alcançável em Symfony Consola.
Pode utilizar o wrapper incorporado em SymfonyStyle através do seguinte exemplo:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Pedir dados sensíveis ao utilizador");
$io->askHidden(
question: "Forneça sua chave de API aqui",
validator: function($answer) { return (42 == strlen($answer)) ?? $answer; }
);
return Command::SUCCESS;
}

Para comunicar algum progresso ao utilizador, podemos utilizar barras de progresso. Symfony A consola tem uma excelente forma de mostrar o progresso ao utilizador, mas lembre-se sempre de estilizar corretamente a saída de progresso. Você pode ter controle total sobre as diferentes partes e como elas são renderizadas usando Formatador. O formato da barra de progresso é apenas uma sequência de diferentes marcadores de posição. Os marcadores de posição disponíveis são: atual, máximo, bar, por cento, decorrido, restantes, estimado, memória e mensagem. Utilize o exemplo abaixo para os manipular.
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Exemplo de barra de progresso estilizada");
$progressBar = new ProgressBar($io, 10000);
$progressBar->setFormat('%current%/%max% [r%] %percent:3s%%
%elapsed:6s%/%estimated:-6s% %memory:6s%');
$progressBar->start();
para ($i = 0; $i advance();
usleep(420);
}
$progressBar->finish();
$io->newLine();
return Command::SUCCESS;
}
Pode utilizar quase tudo como formatador, desde que o seu terminal seja capaz de o mostrar. Oficial Symfony documentação

Estamos habituados a sugestões de consola, funcionalidades de preenchimento automático, etc., na nossa vida de desenvolvimento. Se estiver a criar uma aplicação de consola, deve considerar adicioná-la para que os seus utilizadores não fiquem confusos sobre como utilizar a sua solução CLI de baixo nível. PHP O Symfony Console também pode fornecer isso, fora da caixa, usando CompletionInput classe.
(...)
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 introduziu uma nova forma de lidar com a posição do cursor em aplicações CLI. Desde então, é possível ler e escrever num local específico do ecrã utilizando o prático Cursor classe:
(...)
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 pequena lista de truques é apenas a ponta do icebergue. As possibilidades de Consola Symfony são infinitas, como o comprovam os numerosos projectos como Psalm, PHPStan ou Composer que se baseiam em PHP e utilizado por milhões de Desenvolvedores PHP em todo o mundo.
