Twee redenen om PHP niet te gebruiken
Als PHP ontwikkelaar herinner ik me nog de dagen van PHP4, de eerste (optionele!) GC implementatie in PHP5, en ik heb de _hype_ van de komst van PHP7 en...
Dit artikel is gemaakt met het doel om je de nuttigste en handigste tips en trucs over Symfony Console Development te laten zien.
Als je een PHP ontwikkelaar die jouw PHP softwareontwikkeling naar het volgende niveau is dit artikel voor jou. Laten we meteen ter zake komen.
Je hoort het vaak:
PHP wordt alleen gebruikt om webpagina's te maken
Dit is helemaal niet waar, want tegenwoordig PHP ontwikkeling wordt gebruikt in veel verschillende bedrijfssectoren, die op het eerste gezicht vaak niet zo triviaal zijn.
Zowel de PHP taal en de bijbehorende omgeving ondersteunen HTTP-communicatie perfect, wat het samen met het gebruik van de CLI-omgeving mogelijk maakt om snel webbots, webcrawlers of tools te maken die gegevens in externe omgevingen synchroniseren.
Om dit te ondersteunen heb ik wat statistieken die laten zien dat de Console-component van de Symfony raamwerk, dat eenvoudig toegang geeft tot de commandoregel, staat in de TOP5 meest gebruikte en gedownloade Symfony pakketten aller tijden.
Op dit punt willen we graag een paar trucjes met je delen die elke PHP ontwikkelaar moet weten als je schrijft code in PHP die verondersteld wordt te werken in de CLI.
Tabelweergave met de mogelijkheid om invoer te kiezen kan op een eenvoudige manier worden bereikt met behulp van Symfony Commando:
// src/App/Command/TestCommand.php
beschermde functie uitvoeren(InputInterface $input, OutputInterface $output): int
{
$io = nieuwe SymfonyStyle($input, $output);
$io->titel("Interactieve selectietabel voorbeeld");
$table = $io->createTable();
$table->setHeaderTitle("Interactieve selectietabel voorbeeld");
$table->setRows(iterator_to_array($this->tagsTableRows());
$table->render();
$io->newLine();
return Command::SUCCESS;
}
In bovenstaand voorbeeld maken we gebruik van PHP Generatoren als gegevensbron - wat de schaalbaarheid in de toekomst ten goede komt. Eenvoudige gegevensgenerator voor bovenstaand voorbeeld:
Beschermde functie tagsTableRows(): Generator
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse als $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Het eindresultaat is een Tabel die wordt weergegeven in CLI.
Om het interactief te maken moeten we QuestionHelper gebruiken, dat wordt geleverd als wrapper rond SymfonyStyle
output.
(...)
$choice = nieuwe Keuzevraag(
vraag: "Welke selectie kiest u?",
keuzes: array_reduce(
array: $rows,
callback: functie($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
$answer = $io->vraag($choice);
(...)
Als resultaat krijgen we een interactief keuzeveld met een tabelweergave van dezelfde bron.
Het verbergen van prompts terwijl gevoelige gegevens worden verstrekt is een veelgebruikte praktijk en het is ook gemakkelijk te bereiken in Symfony Console.
Je kunt de ingebouwde wrapper in SymfonyStyle
klasse aan de hand van het volgende voorbeeld:
(...)
beschermde functie uitvoeren(InputInterface $input, OutputInterface $output): int
{
$io = nieuwe SymfonyStyle($input, $output);
$io->titel("Gebruiker om gevoelige gegevens vragen");
$io->askHidden(
vraag: "Geef hier je API-sleutel op",
validator: function($answer) { return (42 == strlen($answer)) ?? $answer; }
);
return Command::SUCCESS;
}
Om de gebruiker te informeren over de voortgang kunnen we voortgangsbalken gebruiken. Symfony Console heeft een geweldige manier om de voortgang aan de gebruiker te tonen, maar vergeet niet om je voortgangsuitvoer altijd op de juiste manier te stylen. Je kunt volledige controle hebben over verschillende onderdelen en hoe ze worden weergegeven met behulp van Opmaak
. Het formaat van de voortgangsbalk bestaat uit een reeks verschillende plaatsaanduidingen. De beschikbare plaatsaanduidingen zijn: huidige
, max
, bar
, procent
, verstreken
, overgebleven
, geschat
, geheugen
en bericht
. Speel ermee met het onderstaande voorbeeld.
(...)
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;
}
Je kunt bijna alles gebruiken als formatter zolang je terminal het maar kan weergeven. Officiële Symfony documentatie
We zijn in ons ontwikkelingsleven gewend aan consolesuggesties, auto-aanvulfuncties en dergelijke. Als je een consoletoepassing maakt, zou je moeten overwegen om deze toe te voegen, zodat je gebruikers niet in verwarring raken over het gebruik van je CLI-oplossing op laag niveau. PHP Symfony Console kan dat ook, out of the box, met behulp van AfrondingInvoer
klasse.
(...)
publieke functie complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 introduceerde een nieuwe manier voor het omgaan met de positie van de cursor in CLI-toepassingen. Sindsdien is het mogelijk om te lezen en schrijven op een specifieke plaats op het scherm met behulp van handige Cursor
klasse:
(...)
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;
}
Deze korte lijst met trucs is slechts het topje van de ijsberg. De mogelijkheden van Symfony Console zijn eindeloos, zoals blijkt uit de talloze projecten zoals Psalm, PHPStan of Composer die zijn gebaseerd op PHP en gebruikt door miljoenen PHP ontwikkelaars over de hele wereld.