To grunner til at du ikke bør bruke PHP
Som PHP-utvikler husker jeg fortsatt dagene med PHP4, den første (valgfrie!) GC-implementeringen i PHP5, og jeg levde gjennom _hype_ av fremveksten av PHP7 og ...
Denne artikkelen ble opprettet med sikte på å vise deg de mest nyttige og nyttige tipsene og triksene om Symfony Console Development.
Hvis du er en PHP utvikler som ønsker å bringe din PHP programvareutvikling til neste nivå, er denne artikkelen noe for deg. La oss komme til saken.
Man hører det ofte:
PHP brukes kun til å lage nettsider
Dette er fullstendig usant, for i dag PHP-utvikling brukes på mange ulike forretningsområder, ofte ikke så trivielle ved første øyekast.
Både PHP og dets miljø støtter HTTP-kommunikasjon perfekt, noe som sammen med bruk av CLI-miljøet gjør det mulig å raskt lage webroboter, webcrawlere eller verktøy som synkroniserer data i eksterne miljøer.
For å underbygge dette har jeg statistikk som viser at konsollkomponenten i Rammeverket Symfonysom gir enkel tilgang til kommandolinjen, er blant de TOPP5 mest brukte og nedlastede Symfony pakker gjennom tidene.
Nå vil vi gjerne dele noen triks med deg som alle PHP utvikler bør vite når du skriver kode i PHP som skal fungere i CLI.
Tabellgjengivelse med mulighet til å velge oppføringer fra kan oppnås på en enkel måte ved hjelp av Symfony Kommando:
// src/App/Command/TestCommand.php
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Eksempel på interaktiv utvalgstabell");
$table = $io->createTable();
$table->setHeaderTitle("Eksempel på interaktiv utvalgstabell");
$table->setRows(iterator_to_array($this->tagsTableRows()));
$table->render();
$io->newLine();
return Command::SUCCESS;
}
I eksempelet ovenfor benytter vi oss av PHP Generatorer som datakilde - noe som bidrar til skalerbarhet i fremtiden. Enkel datagenerator for eksempelet ovenfor:
beskyttet funksjon tagsTableRows(): Generator
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Sluttresultatet er en tabell gjengitt i CLI.
For å gjøre det interaktivt må vi bruke QuestionHelper, som er en innpakning rundt SymfonyStyle
utgang.
(...)
$choice = new ChoiceQuestion(
question: "Hvilket valg velger du?",
valg: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
$answer = $io->askQuestion($choice);
(...)
Resultatet er at vi får et interaktivt valgfelt med en tabellvisning fra samme kilde.
Det er vanlig å skjule ledeteksten mens man oppgir sensitive data, og det er også lett å oppnå i Symfony Konsoll.
Du kan bruke en innebygd wrapper i SymfonyStyle
klassen ved hjelp av følgende eksempel:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Ber brukeren om sensitive data");
$io->askHidden(
question: "Oppgi API-nøkkelen din her",
validator: function($answer) { return (42 == strlen($answer)) ?? $answer; }
);
return Command::SUCCESS;
}
For å kommunisere fremdriften til brukeren kan vi bruke fremdriftslinjer. Symfony Konsollen er en flott måte å vise fremdriften til brukeren på, men husk alltid å utforme fremdriftsresultatet på riktig måte. Du kan ha full kontroll over de ulike delene og hvordan de gjengis ved hjelp av Formatter
. Fremdriftslinjeformatet er bare en rekke forskjellige plassholdere. De tilgjengelige plassholderne er: nåværende
, maks
, bar
, prosent
, utløpt
, resterende
, anslått
, minne
og melding
. Prøv deg frem med eksemplet nedenfor.
(...)
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 bruke nesten hva som helst som formateringsformat, så lenge terminalen din er i stand til å vise det. Offisielle Symfony dokumentasjon
Vi er vant til konsollforslag, autofullføringsfunksjoner og lignende i utviklingslivet vårt. Hvis du lager en konsollapplikasjon, bør du vurdere å legge til dette, slik at brukerne ikke blir forvirret over hvordan de skal bruke din CLI-løsning på lavt nivå. PHP Symfony Console kan også tilby dette, uten videre, ved hjelp av CompletionInput
klasse.
(...)
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 introduserte en ny måte å håndtere markørposisjonen på i CLI-applikasjoner. Siden den gang har det vært mulig å lese og skrive på et bestemt sted på skjermen ved hjelp av hendige Markør
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;
}
Denne korte listen over triks er bare toppen av isfjellet. Mulighetene for Symfony-konsollen er uendelige, noe som bevises av de mange prosjektene som Psalm, PHPStan eller Composer som er basert på PHP og brukes av millioner av PHP-utviklere rundt om i verden.