Dwa powody, dla których nie powinieneś używać PHP
Jako programista PHP wciąż pamiętam czasy PHP4, pierwszą (opcjonalną!) implementację GC w PHP5 i przeżyłem _hype_ związany z nadejściem PHP7 i...
Ten artykuł został stworzony w celu pokazania najbardziej przydatnych i przydatnych wskazówek i sztuczek dotyczących rozwoju konsoli Symfony.
Jeśli jesteś PHP deweloper która chce przynieść PHP rozwój oprogramowania na wyższy poziom, ten artykuł jest dla Ciebie. Bez zbędnych ceregieli przejdźmy do rzeczy.
Często słyszy się:
PHP jest używany tylko do tworzenia stron internetowych
Jest to całkowicie nieprawdziwe, ponieważ obecnie Rozwój PHP jest wykorzystywana w wielu różnych obszarach biznesowych, często nie tak banalnych na pierwszy rzut oka.
Zarówno PHP i jego środowisko doskonale obsługują komunikację HTTP, co w połączeniu z wykorzystaniem środowiska CLI umożliwia szybkie tworzenie botów internetowych, web crawlerów czy narzędzi synchronizujących dane w środowiskach zewnętrznych.
Na poparcie tej tezy mam kilka statystyk, które pokazują, że komponent konsoli Framework Symfony, która umożliwia łatwy dostęp do wiersza poleceń, znajduje się w TOP5 najczęściej używanych i pobieranych aplikacji. Symfony pakietów wszech czasów.
W tym miejscu chcielibyśmy podzielić się z Tobą kilkoma sztuczkami, które każdy Deweloper PHP powinien wiedzieć podczas pisania kod w PHP która powinna działać w CLI.
Renderowanie tabeli z możliwością wyboru wpisów można uzyskać w prosty sposób za pomocą Symfony Polecenie:
// src/App/Command/TestCommand.php
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Przykład interaktywnej tabeli wyboru");
$table = $io->createTable();
$table->setHeaderTitle("Przykład interaktywnej tabeli wyboru");
$table->setRows(iterator_to_array($this->tagsTableRows()));
$table->render();
$io->newLine();
return Command::SUCCESS;
}
W powyższym przykładzie wykorzystujemy Generatory PHP jako źródło danych - co pomaga w skalowalności w przyszłości. Prosty generator danych dla powyższego przykładu:
protected function tagsTableRows(): Generator
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Efektem końcowym jest tabela renderowana w CLI.
Aby uczynić go interaktywnym, musimy użyć QuestionHelper, dostarczonego jako wrapper wokół SymfonyStyle
wyjście.
(...)
$choice = new ChoiceQuestion(
question: "Który wybór wybierasz?",
choices: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
return $carry;
}
)
);
$answer = $io->askQuestion($choice);
(...)
W rezultacie otrzymujemy interaktywne pole wyboru z tabelą wyświetlaną z tego samego źródła.
Ukrywanie podpowiedzi przy jednoczesnym udostępnianiu wrażliwych danych jest powszechną praktyką i jest również łatwo osiągalne w Symfony Konsola.
Możesz użyć wbudowanego wrappera w SymfonyStyle
na poniższym przykładzie:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Zapytanie użytkownika o wrażliwe dane");
$io->askHidden(
question: "Podaj tutaj swój klucz API",
validator: function($answer) { return (42 == strlen($answer)) ?? $answer; }
);
return Command::SUCCESS;
}
Aby zakomunikować użytkownikowi postęp, możemy użyć pasków postępu. Symfony Konsola ma świetny sposób na pokazanie postępu użytkownikowi, ale zawsze należy pamiętać o prawidłowym stylu wyjścia postępu. Możesz mieć pełną kontrolę nad różnymi częściami i sposobem ich renderowania za pomocą Formatter
. Format paska postępu to po prostu ciąg różnych symboli zastępczych. Dostępne symbole zastępcze to: bieżący
, maks
, pasek
, procent
, upłynął
, pozostały
, szacowany
, pamięć
i wiadomość
. Można to zrobić na poniższym przykładzie.
(...)
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;
}
Możesz użyć prawie wszystkiego jako formatyzatora, o ile twój terminal jest w stanie go wyświetlić. Oficjalny Symfony dokumentacja
Jesteśmy przyzwyczajeni do sugestii konsoli, funkcji autouzupełniania i tym podobnych w naszym życiu programistycznym. Jeśli tworzysz aplikację konsolową, powinieneś rozważyć dodanie jej, aby użytkownicy nie byli zdezorientowani, jak korzystać z niskopoziomowego rozwiązania CLI. PHP Symfony Console również może to zapewnić, po wyjęciu z pudełka, używając CompletionInput
klasa.
(...)
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 wprowadziła nowy sposób obsługi pozycji kursora w aplikacjach CLI. Od tego czasu możliwe jest odczytywanie i zapisywanie w określonym miejscu na ekranie za pomocą przydatnych funkcji Kursor
klasa:
(...)
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;
}
Ta krótka lista sztuczek to tylko wierzchołek góry lodowej. Możliwości Konsola Symfony są nieskończone, o czym świadczą liczne projekty, takie jak Psalm, PHPStan czy Composer, które bazują na PHP i używane przez miliony Programiści PHP na całym świecie.