Två skäl till att du inte bör använda PHP
Som en PHP-utvecklare minns jag fortfarande dagarna för PHP4, den första (valfria!) GC-implementeringen i PHP5, och jag levde genom _hype_ av tillkomsten av PHP7 och ...
Den här artikeln skapades i syfte att visa dig de mest användbara och hämta tips och tricks om Symfony Console Development.
Om du är en PHP utvecklare som vill ta med sig din PHP Utveckling av programvara till nästa nivå är den här artikeln för dig. Utan ytterligare ado låt oss skära till jakten.
Det hör man ofta:
PHP används endast för att skapa webbsidor
Detta är helt felaktigt eftersom det nuförtiden PHP utveckling används inom många olika affärsområden, ofta inte så triviala vid första anblicken.
Både PHP och dess miljö har ett perfekt stöd för HTTP-kommunikation, vilket tillsammans med användningen av CLI-miljön gör det möjligt att snabbt skapa webbrobotar, web crawlers eller verktyg som synkroniserar data i externa miljöer.
Som stöd för detta har jag lite statistik som visar att konsolkomponenten i Symfony-ramverksom ger enkel åtkomst till kommandoraden, är bland de TOP5 mest använda och nedladdade Symfony paket genom tiderna.
Nu vill vi dela med oss av några knep som alla kan använda PHP utvecklare bör veta när man skriver kod i PHP som är tänkt att fungera i CLI.
Tabellrendering med möjlighet att välja poster från kan uppnås på ett enkelt sätt med hjälp av Symfony Kommando:
// src/App/Command/TestCommand.php
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Exempel på interaktiv urvalstabell");
$table = $io->createTable();
$table->setHeaderTitle("Exempel på interaktiv urvalstabell");
$able->setRows(iterator_to_array($this->tagsTableRows()));
$able->render();
$io->newLine();
return Command::SUCCESS;
}
I ovanstående exempel utnyttjar vi PHP Generatorer som datakälla - vilket hjälper till med skalbarheten i framtiden. Enkel datagenerator för ovanstående exempel:
skyddad funktion tagsTableRows(): Generator
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Slutresultatet är en tabell som återges i CLI.
För att göra det interaktivt måste vi använda QuestionHelper, som tillhandahålls som ett hölje runt SymfoniStyle
utgång.
(...)
$choice = new ChoiceQuestion(
fråga: "Vilket val väljer du?",
choices: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
$answer = $io->ställa fråga($choice);
(...)
Resultatet är att vi får ett interaktivt valfält med en tabellvisning från samma källa.
Att dölja snabbmeddelanden samtidigt som man tillhandahåller känslig information är ett vanligt förfarande och det är också lätt att uppnå i Symfony Konsol.
Du kan använda den inbyggda wrappern i SymfoniStyle
klass enligt följande exempel:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Frågar användaren om känsliga uppgifter");
$io->askHidden(
fråga: "Ange din API-nyckel här",
validator: function($answer) { return (42 == strlen($answer)) ?? 1TP60Svar; }
);
return Command::SUCCESS;
}
För att förmedla vissa framsteg till användaren kan vi använda Progress Bars. Symfony Console är ett utmärkt sätt att visa framsteg för användaren, men kom alltid ihåg att utforma dina framsteg på rätt sätt. Du kan ha full kontroll över olika delar och hur de återges med hjälp av Formaterare
. Förloppsindikatorns format är bara en sträng med olika platshållare. De tillgängliga platshållarna är: ström
, max
, bar
, procent
, förflutit
, kvarvarande
, uppskattad
, minne
och meddelande
. Försök med dem med hjälp av exemplet nedan.
(...)
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;
}
Du kan använda nästan vad som helst som formaterare så länge din terminal kan visa det. Officiell Symfony dokumentation
Vi är vana vid konsolförslag, autokompletteringsfunktioner och liknande i vårt utvecklingsliv. Om du skapar en konsolapplikation bör du överväga att lägga till det så att dina användare inte blir förvirrade över hur de ska använda din CLI-lösning på låg nivå. PHP Symfony Console kan också tillhandahålla det, direkt ur lådan, med hjälp av SlutförandeInput
klass.
(...)
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 introducerade ett nytt sätt att hantera markörens position i CLI-program. Sedan dess är det möjligt att läsa och skriva på en specifik plats på skärmen med hjälp av praktiska Markör
klass:
(...)
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;
}
Den här korta listan med knep är bara toppen av isberget. Möjligheterna med Symfony-konsolen är oändliga, vilket framgår av de många projekt som Psalm, PHPStan eller Composer som är baserade på PHP och används av miljontals människor PHP utvecklare runt om i världen.