Due motivi per non usare PHP
Come sviluppatore PHP ricordo ancora i giorni dell'PHP4, la prima implementazione (opzionale!) del GC nell'PHP5, e ho vissuto l'_hype_ dell'avvento dell'PHP7 e...
Questo articolo è stato creato con l'obiettivo di mostrare i consigli e i trucchi più utili e interessanti sullo sviluppo di Symfony Console.
Se siete un PHP sviluppatore che vuole portare il vostro PHP sviluppo software al livello successivo, questo articolo è per voi. Senza ulteriori indugi, andiamo al sodo.
Si sente spesso dire:
L'PHP viene utilizzato solo per creare pagine web.
Questo è completamente falso, perché al giorno d'oggi Sviluppo PHP è utilizzato in molte aree aziendali diverse, spesso non così banali a prima vista.
Sia il PHP e il suo ambiente supportano perfettamente la comunicazione HTTP che, insieme all'uso dell'ambiente CLI, consente di creare rapidamente bot web, web crawler o strumenti che sincronizzano i dati in ambienti esterni.
A sostegno di ciò ho alcune statistiche che dimostrano che la componente Console della Quadro Symfonyche consente un facile accesso alla riga di comando, è nella TOP5 dei programmi più utilizzati e scaricati. Symfony di tutti i tempi.
A questo punto, vorremmo condividere con voi alcuni trucchi che ogni Sviluppatore PHP dovrebbero sapere quando si scrive codice in PHP che dovrebbe funzionare nella CLI.
La resa delle tabelle con la possibilità di scegliere le voci può essere ottenuta in modo semplice utilizzando Symfony Comando:
// src/App/Command/TestCommand.php
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Esempio di tabella di selezione interattiva");
$table = $io->createTable();
$table->setHeaderTitle("Esempio di tabella di selezione interattiva");
$table->setRows(iterator_to_array($this->tagsTableRows());
$table->render();
$io->newLine();
restituire Command::SUCCESS;
}
Nell'esempio precedente si sfrutta l'opzione Generatori PHP come fonte di dati, il che aiuta la scalabilità in futuro. Semplice generatore di dati per l'esempio precedente:
funzione protetta tagTableRows(): Generator
{
$apiTagsResponse = $this->someInjectedService->getTags();
foreach ($apiTagsResponse as $apiTagResponse) {
yield [ $apiTagResponse->getName(), $apiTagResponse->getId() ];
}
}
Il risultato finale è una tabella visualizzata in CLI.
Per renderlo interattivo è necessario utilizzare QuestionHelper, fornito come wrapper attorno a SymfonyStyle
uscita.
(...)
$choice = nuovo ChoiceQuestion(
domanda: "Quale selezione scegli?",
scelte: array_reduce(
array: $rows,
callback: function($carry, $item) {
$carry[] = $item[0];
restituisce $carry;
}
)
);
$answer = $io->askQuestion($choice);
(...)
Il risultato è un campo di scelta interattivo con una tabella visualizzata dalla stessa fonte.
Nascondere i prompt fornendo dati sensibili è una pratica comune ed è anche facilmente realizzabile in Symfony Console.
È possibile utilizzare il wrapper integrato in SymfonyStyle
con il seguente esempio:
(...)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$io->title("Richiesta di dati sensibili all'utente");
$io->askHidden(
domanda: "Fornisci qui la tua chiave API",
validator: function($answer) { return (42 == strlen($answer)) ?? $answer; }
);
return Command::SUCCESS;
}
Per comunicare all'utente alcuni progressi, possiamo utilizzare le barre di avanzamento. Symfony La console offre un ottimo modo per mostrare i progressi all'utente, ma bisogna sempre ricordarsi di stilizzare correttamente l'output dei progressi. Si può avere il pieno controllo sulle diverse parti e sul modo in cui vengono rese, utilizzando Formattatore
. Il formato della barra di avanzamento è solo una stringa di segnaposto diversi. I segnaposto disponibili sono: corrente
, massimo
, bar
, percentuale
, trascorso
, rimanente
, stimato
, memoria
e messaggio
. Giocate con loro con l'esempio che segue.
(...)
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;
}
Si può usare quasi tutto come formattatore, purché il terminale sia in grado di visualizzarlo. Ufficiale Symfony documentazione
Nella nostra vita di sviluppo siamo abituati ai suggerimenti della console, alle funzioni di completamento automatico e così via. Se state creando un'applicazione per console, dovreste considerarne l'aggiunta, in modo che i vostri utenti non siano confusi su come utilizzare la vostra soluzione CLI di basso livello. PHP Symfony Console può fornire anche questo, in modo immediato, usando Ingresso di completamento
classe.
(...)
public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void
{
if ($input->mustSuggestArgumentValuesFor(argumentName: 'someArgument')) {
$suggestions->suggestValues(['someSuggestion', 'otherSuggestion']);
}
}
Symfony 5.1 ha introdotto un nuovo modo di gestire la posizione del cursore nelle applicazioni CLI. Da allora è possibile leggere e scrivere in un punto specifico dello schermo, utilizzando i comodi comandi Cursore
classe:
(...)
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;
}
Questo breve elenco di trucchi è solo la punta dell'iceberg. Le possibilità di Console Symfony sono infinite, come dimostrano i numerosi progetti come Psalm, PHPStan o Composer che si basano su PHP e utilizzato da milioni di Sviluppatori PHP in tutto il mondo.