Dvi priežastys, kodėl neturėtumėte naudoti PHP
Kaip PHP kūrėjas aš vis dar prisimenu PHP4 dienas, pirmąjį (neprivalomą!) GC įgyvendinimą PHP5, išgyvenau PHP7 ir...
Šis straipsnis buvo sukurtas siekiant parodyti jums naudingiausius ir naudingiausius patarimus ir gudrybes apie "Symfony" konsolės kūrimą.
Jei esate PHP kūrėjas kuri nori atnešti jūsų PHP programinės įrangos kūrimas į aukštesnį lygį, šis straipsnis skirtas jums. Toliau nesidrovėdami pereikime prie reikalo.
Dažnai girdite:
PHP naudojamas tik žiniatinklio svetainė puslapiai
Tai visiškai netiesa, nes šiais laikais PHP kūrimas naudojama daugelyje skirtingų verslo sričių, dažnai iš pirmo žvilgsnio ne tokių trivialių.
Tiek PHP kalba ir jos aplinka puikiai palaiko HTTP ryšį, o tai kartu su CLI aplinka leidžia greitai sukurti interneto robotus, interneto naršykles arba įrankius, kurie sinchronizuoja duomenys išorinėje aplinkoje.
Šiam teiginiui pagrįsti turiu keletą statistinių duomenų, kurie rodo, kad konsolės komponentas "Symfony" sistema, kuri leidžia lengvai pasiekti komandinę eilutę, yra tarp TOP5 dažniausiai naudojamų ir atsisiųstų Symfony visų laikų paketai.

Šiuo metu norėtume pasidalyti keliomis gudrybėmis, kurias kiekvienas PHP kūrėjas turėtų žinoti rašydami kodas svetainėje PHP kuri turėtų veikti CLI.

Lentelės atvaizdavimą su galimybe pasirinkti įrašus galima lengvai pasiekti naudojant Symfony Komanda:
// src/App/Command/TestCommand.php
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Interaktyvios pasirinkimo lentelės pavyzdys");
$table = $io->createTable();
$table->setHeaderTitle("Interaktyvios atrankos lentelės pavyzdys");
$table->setRows(iterator_to_array($this->tagsTableRows()));
$table->render();
$io->newLine();
return Command::SUCCESS;
}
Pirmiau pateiktame pavyzdyje naudojame PHP generatoriai kaip duomenų šaltinį, kuris padeda mastelio keitimas ateityje. Paprastas pirmiau pateikto pavyzdžio duomenų generatorius:
apsaugota funkcija tagsTableRows(): Generatorius
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagsResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Galutinis rezultatas - CLI sistemoje atvaizduota lentelė.

Kad jis būtų interaktyvus, turime naudoti QuestionHelper, pateiktą kaip apvalkalą aplink SymfonyStyle produkcija.
(...)
$choice = new ChoiceQuestion(
klausimas: 'Kurį pasirinkimą pasirenkate?',
pasirinkimas: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
1TP77Atsakymas = $io->užduotiklausimą($choice);
(...)
Todėl iš to paties šaltinio gauname interaktyvųjį pasirinkimo lauką ir lentelės rodinį.

Paslėpti raginimą pateikiant neskelbtinus duomenis yra įprasta praktika, kurią taip pat lengva pasiekti Symfony Konsolė.
Galite naudoti integruotą apvalkalą SymfonyStyle klasę pagal šį pavyzdį:
(...)
apsaugota funkcija execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Prašymas naudotojui pateikti neskelbtinus duomenis");
$io->askHidden(
question: "Pateikite savo API raktas čia",
validator: function($answer) { return (42 == strlen($answer)) ?? $answer; }
);
return Command::SUCCESS;
}

Norėdami pranešti naudotojui apie tam tikrą pažangą, galime naudoti pažangos juostas. Symfony "Console" turi puikų būdą parodyti naudotojui pažangą, tačiau visada nepamirškite tinkamai stilizuoti pažangos išvesties. Galite visiškai kontroliuoti įvairias dalis ir jų atvaizdavimo būdą naudodami Formatter. Pažangos juostos formatas - tai tik įvairių žymeklių eilutė. Galimi šie žymenys: dabartinis, max, baras, proc., praėjo, likęs, apytikriai, atmintis ir pranešimas. Pasinaudokite jais pagal toliau pateiktą pavyzdį.
(...)
apsaugota funkcija execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Styled progress bar example");
$progressBar = new ProgressBar($io, 10000);
$progressBar->setFormat('%current%/%max% [r%] %percent:3s%%
%elapsed:6s%/%estimated:-6s% %memory:6s%');
$progressBar->start();
for ($i = 0; $i advance();
usleep(420);
}
$progressBar->finish();
$io->newLine();
return Command::SUCCESS;
}
Galite naudoti beveik bet ką kaip formatatorių, jei tik terminalas gali jį rodyti. Oficialus Symfony dokumentacija

Esame įpratę prie konsolinių pasiūlymų, automatinio užbaigimo funkcijų ir panašių dalykų. Jei kuriate konsolinę programą, turėtumėte apsvarstyti galimybę ją pridėti, kad naudotojams nekiltų neaiškumų, kaip naudotis jūsų žemo lygio CLI sprendimu. PHP "Symfony Console" gali tai užtikrinti ir iškart, naudodama CompletionInput klasė.
(...)
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 pristatytas naujas žymeklio padėties tvarkymo CLI programose būdas. Nuo tada galima skaityti ir rašyti tam tikroje ekrano vietoje naudojant patogų Kursorius klasė:
(...)
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;
}

Šis trumpas gudrybių sąrašas yra tik ledkalnio viršūnė. Galimybės "Symfony" konsolė yra begalė, kaip rodo daugybė projektų, pvz., Psalm, PHPStan ar Composer, kurie yra pagrįsti PHP ir naudojami milijonų žmonių. PHP kūrėjai visame pasaulyje.
