Divi iemesli, kāpēc nevajadzētu izmantot PHP
Kā PHP izstrādātājs es joprojām atceros PHP4 dienas, pirmo (neobligāto!) GC implementāciju PHP5, un es piedzīvoju PHP7 un...
Šis raksts tika izveidots ar mērķi parādīt jums visnoderīgākos un noderīgākos padomus un trikus par Symfony Console izstrādi.
Ja esat PHP izstrādātājs kas vēlas, lai jūsu PHP programmatūras izstrāde uz nākamo līmeni, šis raksts ir domāts jums. Bez liekas ābeces pāriesim pie lietas būtības.
Jūs bieži dzirdat:
PHP tiek izmantots tikai tīmekļa vietne lapas
Tas ir pilnīgi nepatiesi, jo mūsdienās PHP izstrāde tiek izmantots daudzās dažādās uzņēmējdarbības jomās, kas bieži vien no pirmā acu uzmetiena nav tik triviālas.
Gan PHP valoda un tās vide lieliski atbalsta HTTP saziņu, kas kopā ar CLI vides izmantošanu ļauj ātri izveidot tīmekļa robotus, tīmekļa pārlūkošanas rīkus vai rīkus, kas sinhronizē dati ārējā vidē.
Lai to pamatotu, man ir daži statistikas dati, kas liecina, ka konsoles komponents Symfony ietvars, kas ļauj viegli piekļūt komandrindai, ir starp TOP5 visbiežāk izmantotajiem un lejupielādētajiem. Symfony visu laiku iepakojumi.

Šajā brīdī mēs vēlamies dalīties ar jums ar dažiem trikiem, ko katrs PHP izstrādātājs jāzina, rakstot kods vietnē PHP kas ir paredzēts darbam CLI.

Tabulu atveidošanu ar iespēju izvēlēties ierakstus var viegli panākt, izmantojot Symfony Komanda:
// src/App/Command/TestCommand.php
aizsargāta funkcija execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Interaktīvās atlases tabulas piemērs");
$table = $io->createTable();
$table->setHeaderTitle("Interaktīvās atlases tabulas piemērs");
$table->setRows(iterator_to_array($this->tagsTableRows()));
$table->render();
$io->newLine();
return Command::SUCCESS;
}
Iepriekš minētajā piemērā mēs izmantojam PHP ģeneratori kā datu avots - kas palīdz mērogojamība nākotnē. Vienkāršs datu ģenerators iepriekš minētajam piemēram:
aizsargāta funkcija tagsTableRows(): Ģenerators
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagsResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Galarezultāts ir CLI atveidota tabula.

Lai to padarītu interaktīvu, mums ir jāizmanto QuestionHelper, kas ir kā ietvars ap SymfonyStyle izejas.
(...)
$choice = new ChoiceQuestion(
jautājums: 'Kādu izvēli jūs izvēlaties?',
izvēle: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
1TP77Atbilde = $io->jautājums($choice);
(...)
Rezultātā mēs iegūstam interaktīvu izvēles lauku ar tabulas rādījumu no viena un tā paša avota.

Raidījuma slēpšana, vienlaikus sniedzot sensitīvus datus, ir izplatīta prakse, un to ir viegli panākt arī ar Symfony Konsole.
Varat izmantot iebūvēto ietvaru SymfonyStyle klasi, izmantojot šādu piemēru:
(...)
aizsargāta funkcija execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Pieprasīt lietotājam sensitīvus datus");
$io->askHidden(
question: "Sniedziet savu API atslēga šeit",
validator: function($answer) { return (42 == strlen($answer)) ??? $answer; }
);
return Command::SUCCESS;
}

Lai paziņotu lietotājam par progresu, varam izmantot progresa joslas. Symfony Konsole ir lielisks veids, kā lietotājam parādīt progresu, taču vienmēr atcerieties pareizi stilizēt progresa izvades rezultātus. Jūs varat pilnībā kontrolēt dažādas daļas un to atveidošanas veidu, izmantojot Formatētājs. Progresa joslas formāts ir tikai virkne dažādu vietrāžu. Pieejamās vietzīmes ir šādas: pašreizējais, max, bārs, procenti, pagājis, atlikušo, aplēses, atmiņa un ziņojums. Izspēlēiet tos, izmantojot tālāk sniegto piemēru.
(...)
aizsargāta 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%%
%elpa:6s%/%estimated:-6s% %memory:6s%');
$progressBar->start();
for ($i = 0; $i advance();
usleep(420);
}
$progressBar->finish();
$io->newLine();
return Command::SUCCESS;
}
Kā formatētāju varat izmantot gandrīz jebko, ja vien termināls spēj to attēlot. Oficiālais Symfony dokumentācija

Mēs esam pieraduši pie konsoles ieteikumiem, automātiskās pabeigšanas funkcijām un tamlīdzīgām lietām. Ja veidojat konsoles lietojumprogrammu, jums jāapsver iespēja to pievienot, lai lietotāji nesaprastu, kā izmantot jūsu zema līmeņa CLI risinājumu. PHP Symfony Console var nodrošināt arī šo funkciju, izmantojot CompletionInput klase.
(...)
publiskā funkcija complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues([['someSuggestion', 'otherSuggestion']]);
}
}
Symfony 5.1 ieviests jauns veids, kā CLI lietojumprogrammās apstrādāt kursora pozīciju. Kopš tā laika ir iespējams lasīt un rakstīt noteiktā ekrāna vietā, izmantojot ērto Kursors klase:
(...)
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 īsais triku saraksts ir tikai aisberga virsotne. Iespējas Symfony konsole ir bezgalīgas, par ko liecina daudzie projekti, piemēram, Psalm, PHPStan vai Composer, kas balstās uz PHP un izmanto miljoniem PHP izstrādātāji visā pasaulē.
