Dva důvody, proč byste neměli používat PHP
Jako vývojář PHP si ještě pamatuji časy PHP4, první (volitelnou!) implementaci GC v PHP5 a prožil jsem _hype_ příchodu PHP7 a...
Tento článek byl vytvořen s cílem ukázat vám nejužitečnější a nejpoužívanější tipy a triky o vývoji konzole Symfony.
Pokud jste PHP vývojář která chce přinést vaše PHP vývoj softwaru na vyšší úroveň, je tento článek určen právě vám. Bez dalších okolků přejděme k věci.
Často slýcháte:
PHP se používá pouze k vytváření webových stránek.
To je zcela nepravdivé, protože v dnešní době Vývoj PHP se používá v mnoha různých oblastech podnikání, které často nejsou na první pohled tak triviální.
Obě PHP Jazyk a jeho prostředí dokonale podporují komunikaci HTTP, což spolu s využitím prostředí CLI umožňuje rychle vytvářet webové roboty, webové crawlery nebo nástroje, které synchronizují data v externích prostředích.
Na podporu tohoto tvrzení mám několik statistik, které ukazují, že složka konzole Rámec Symfony, který umožňuje snadný přístup k příkazovému řádku, je v TOP5 nejpoužívanějších a nejstahovanějších aplikací. Symfony balíčky všech dob.

Na tomto místě bychom se s vámi rádi podělili o několik triků, které každý Vývojář PHP by měl vědět při psaní kód na adrese PHP který by měl fungovat v CLI.

Vykreslování tabulek s možností výběru záznamů lze snadno dosáhnout pomocí funkce Symfony Příkaz:
// src/App/Command/TestCommand.php
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Interaktivní příklad výběrové tabulky");
$table = $io->createTable();
$table->setHeaderTitle("Příklad interaktivní výběrové tabulky");
$table->setRows(iterator_to_array($this->tagsTableRows());
$table->render();
$io->newLine();
return Command::SUCCESS;
}
Ve výše uvedeném příkladu využíváme Generátory PHP jako zdroj dat - což pomáhá škálovatelnost v budoucnu. Jednoduchý generátor dat pro výše uvedený příklad:
chráněná funkce tagsTableRows(): Generátor
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Konečným výsledkem je tabulka vykreslená v CLI.

Aby byl interaktivní, musíme použít nástroj QuestionHelper, který je k dispozici jako obal kolem nástroje SymfonyStyle výstup.
(...)
$choice = new ChoiceQuestion(
otázka: "Který výběr si vyberete?",
choices: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
$answer = $io->askQuestion($choice);
(...)
Výsledkem je interaktivní pole výběru se zobrazením tabulky ze stejného zdroje.

Skrytí výzvy a zároveň poskytnutí citlivých údajů je běžnou praxí a je snadno dosažitelné i v případě. Symfony Konzole.
Můžete použít vestavěný wrapper v SymfonyStyle podle následujícího příkladu:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Asking user for sensitive data");
$io->askHidden(
question: "Zde uveďte svůj klíč API",
validator: function($answer) { return (42 == strlen($answer)) ?? $answer; }
);
return Command::SUCCESS;
}

Abychom uživateli sdělili určitý pokrok, můžeme použít Progress Bars. Symfony Konzola nabízí skvělý způsob, jak uživateli zobrazit průběh, ale vždy nezapomeňte správně nastylovat výstup průběhu. Můžete mít plnou kontrolu nad různými částmi a způsobem jejich vykreslování pomocí funkce Formátovač. Formát ukazatele průběhu je jen řetězec různých zástupných znaků. K dispozici jsou tyto zástupné znaky: aktuální, max, bar, procenta, uplynula, zbývající, odhad, paměť a zpráva. Pohrajte si s nimi podle níže uvedeného příkladu.
(...)
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;
}
Jako formátovač můžete použít téměř cokoli, pokud to váš terminál dokáže zobrazit. Oficiální stránky Symfony dokumentace

Při vývoji jsme zvyklí na konzolové návrhy, funkce automatického dokončování a podobně. Pokud vytváříte konzolovou aplikaci, měli byste zvážit její přidání, aby uživatelé nebyli zmateni, jak používat vaše nízkoúrovňové řešení CLI. PHP Symfony Console to umí také, a to hned po vybalení z krabice, s použitím CompletionInput třída.
(...)
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 zavedl nový způsob zpracování pozice kurzoru v aplikacích CLI. Od té doby je možné číst a zapisovat na konkrétní místo na obrazovce pomocí šikovných nástrojů. Kurzor třída:
(...)
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;
}

Tento krátký seznam triků je jen špičkou ledovce. Možnosti Konzola Symfony jsou nekonečné, o čemž svědčí řada projektů jako Psalm, PHPStan nebo Composer, které jsou založeny na. PHP a používají je miliony Vývojáři PHP po celém světě.
