To grunde til, at du ikke bør bruge PHP
Som PHP-udvikler husker jeg stadig dagene med PHP4, den første (valgfri!) GC-implementering i PHP5, og jeg oplevede _hype_ om fremkomsten af PHP7 og...
Denne artikel er lavet med det formål at vise dig de mest nyttige og nyttige tips og tricks om Symfony Console Development.
Hvis du er en PHP Udvikler der ønsker at bringe din PHP softwareudvikling til det næste niveau, er denne artikel noget for dig. Lad os uden videre komme til sagen.
Det hører man ofte:
PHP bruges kun til at lave websider
Det er fuldstændig usandt, for i dag PHP udvikling bruges inden for mange forskellige forretningsområder, ofte ikke så trivielle ved første øjekast.
Både den PHP sproget og dets miljø understøtter HTTP-kommunikation perfekt, hvilket sammen med brugen af CLI-miljøet gør det muligt hurtigt at oprette webrobotter, webcrawlere eller værktøjer, der synkroniserer data i eksterne miljøer.
For at understøtte dette har jeg nogle statistikker, der viser, at konsolkomponenten i Symfony-rammeværksom giver nem adgang til kommandolinjen, er blandt de TOP5 mest brugte og downloadede Symfony pakker nogensinde.
På dette tidspunkt vil vi gerne dele et par tricks med dig, som enhver PHP udvikler bør vide, når man skriver Kode i PHP der skal fungere i CLI.
Tabelgengivelse med mulighed for at vælge poster fra kan opnås på en nem måde ved hjælp af 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 udvælgelsestabel");
$table = $io->createTable();
$table->setHeaderTitle("Eksempel på interaktiv udvælgelsestabel");
$table->setRows(iterator_to_array($this->tagsTableRows()));
$able->render();
$io->newLine();
return Command::SUCCESS;
}
I ovenstående eksempel udnytter vi PHP Generatorer som datakilde - hvilket hjælper med skalerbarhed i fremtiden. Simpel datagenerator til ovenstående eksempel:
beskyttet funktion tagsTableRows(): Generator
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Slutresultatet er en tabel, der gengives i CLI.
For at gøre det interaktivt skal vi bruge QuestionHelper, der leveres som et omslag omkring SymfonyStyle
output.
(...)
$choice = new ChoiceQuestion(
spørgsmål: "Hvilket valg vælger du?",
choices: 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 tabelvisning fra samme kilde.
Det er almindeligt at skjule en prompt, mens man leverer følsomme data, og det er også let at opnå i Symfony Konsol.
Du kan bruge den indbyggede wrapper i SymfonyStyle
klasse ved hjælp af følgende eksempel:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Beder brugeren om følsomme data");
$io->askHidden(
spørgsmål: "Angiv din API-nøgle her",
validator: function($answer) { return (42 == strlen($answer)) ?? $answer; }
);
return Command::SUCCESS;
}
For at kommunikere nogle fremskridt til brugeren kan vi bruge Progress Bars. Symfony Console er en fantastisk måde at vise brugeren fremskridt på, men husk altid at style dine fremskridt korrekt. Du kan have fuld kontrol over forskellige dele, og hvordan de gengives, ved at bruge Formaterer
. Statuslinjens format er blot en række forskellige pladsholdere. De tilgængelige pladsholdere er: nuværende
, max
, bar
, procent
, forløbet
, resterende
, anslået
, hukommelse
og besked
. Leg med dem 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 bruge næsten hvad som helst som formattering, så længe din terminal kan vise det. Officiel Symfony dokumentation
Vi er vant til konsolforslag, autoudfyldningsfunktioner og den slags i vores udviklingsliv. Hvis du laver et konsolprogram, bør du overveje at tilføje det, så dine brugere ikke bliver forvirrede over, hvordan de skal bruge din CLI-løsning på lavt niveau. PHP Symfony Console kan også levere det, out of the box, ved hjælp af AfslutningInput
klasse.
(...)
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 introducerede en ny måde at håndtere markørens position på i CLI-programmer. Siden da har det været muligt at læse og skrive på et bestemt sted på skærmen ved hjælp af den praktiske 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 liste over tricks er kun toppen af isbjerget. Mulighederne for Symfony-konsollen er uendelige, som det fremgår af de mange projekter som Psalm, PHPStan eller Composer, der er baseret på PHP og bruges af millioner af PHP-udviklere rundt omkring i verden.