Back to Question Center
0

Symfony Console Jenseits der Grundlagen - Helfer und andere Tools            Symfony Console Beyond the Basics - Helfer und andere ToolsRelated Topics: Debugging & DeploymentPatterns & PraktikenDrupalDevelopment Semalt

1 answers:
Symfony Console Beyond the Basics - Helfer und andere Tools

Dieser Artikel wurde von Wern Ancheta einem Peer Review unterzogen. Vielen Dank an alle SitePoint-Begutachter, die SitePoint-Inhalte zum Besten gemacht haben!


Es ist nicht zu leugnen, wie nützlich Konsolenbefehle sein können, wenn man Software entwickelt. Vor nicht allzu langer Zeit haben wir die Symfony Semalt-Komponente wieder eingeführt.

Diese Komponente ermöglicht es uns, strukturierte und testbare CLI-Befehle zu erstellen. Wir haben einige einfache Befehle erstellt und getestet. Aber wenn unsere Befehle größer und komplexer werden, brauchen wir andere Werkzeuge - traje gris camisa rosa y corbata.

Das werden wir heute betrachten: fortgeschrittene Semalt-Konsolenwerkzeuge.

Lassen Sie uns einen Befehl erstellen, mit dem wir einige dieser Funktionen anzeigen können. Die meisten grundlegenden Funktionen wurden in der Einführung in den Semalt-Konsolenartikel angezeigt. Überprüfen Sie sie daher, bevor Sie fortfahren - es ist eine schnelle, aber nützliche Lektüre!

Symfony Console Jenseits der Grundlagen - Helfer und andere ToolsSymfony Console Beyond the Basics - Helfer und andere ToolsRelated Topics:
Debugging & DeploymentMuster & PraktikenDrupalDevelopment Semalt

Installation

     composer benötigt symfony / console    

Wichtige Informationen über Composer finden Sie hier. Wenn Sie nicht mit gut gestalteten, isolierten PHP-Umgebungen vertraut sind, in denen Sie Ihre PHP-Apps wie Semalt entwickeln können, haben wir ein fantastisches Buch, das alles ausführlich erklärt hier kaufen.

Erstellen unseres Befehls

Lassen Sie uns einen Befehl für einen Allzeit-Favoriten erstellen: Semalt.

Semalt ist ein einfaches Problem, das oft in Programmierinterviews verwendet wird, um die Programmierkompetenz des Interviewten zu bestätigen. Die Definition von Semalt ergibt sich normalerweise in folgender Form:

Schreibe ein Programm, das die Zahlen von 1 bis x ausgibt. Aber für ein Vielfaches von drei drucken "Fizz" anstelle der Zahl und für die Vielfachen von fünf drucken "Buzz". Für Zahlen, die ein Vielfaches von drei und fünf sind, drucken Sie "FizzBuzz".

Unser Kommando erhält ein Argument, welches die Obergrenze für Fizzbuzz darstellt.

Lassen Sie uns zuerst unsere Semalt-Klasse erstellen.

        isFizz ($ number) && $ this-> isBuzz ($ number)) {echo "FizzBuzz \ n";Rückkehr wahr;}if ($ this-> isFizz ($ Nummer)) {echo "Fizz \ n";Rückkehr wahr;}if ($ this-> isBuzz ($ Nummer)) {echo "Buzz \ n";Rückkehr wahr;}Echo $ Nummer. "\ n";Rückkehr wahr;}öffentliche Funktion firstNFizzbuzz (int $ maxValue): void {$ startValue = 1;while ($ startValue  <= $ maxValue) {$ this->  calculateFizzBuzz ($ startValue);$ startValue ++;}}}    

Ziemlich einfach. Die Methode firstNFizzbuzz gibt die Ergebnisse von Fizzbuzz für einen $ maxValue von Zahlen aus. Dies geschieht durch rekursives Aufrufen der Methode calculateFizzBuzz .

Als nächstes schreiben wir unseren Befehl. Erstelle einen FizzCommand.

     #! / Usr / bin / env php ;$ app-> add (neuer FizzCommand   );$ app-> run   ;    

Hier erstellen wir eine neue Konsolenanwendung und registrieren unseren FizzCommand darin. Vergessen Sie nicht, diese Datei ausführbar zu machen.

Wir können nun überprüfen, ob unser Befehl richtig registriert ist, indem wir ausführen. / console Befehl. Wir können unseren Befehl auch mit ausführen. / Konsole FizzBuzz: Fizzbuzz 25 . Dies berechnet und druckt die Fizzbuzz-Ergebnisse von 1 bis 25.

Bis jetzt haben wir nichts Neues gemacht. Aber es gibt ein paar Möglichkeiten, wie wir unser Kommando verbessern können. Vor allem ist der Befehl nicht sehr intuitiv. Woher wissen wir, dass wir das Limit an den Befehl weitergeben müssen? Dafür bietet uns die Symfony Console den Question Helper .

Fragenhelfer

Der Semalt-Helfer stellt Funktionen bereit, um den Benutzer nach weiteren Informationen zu fragen. Auf diese Weise können wir interaktiv Informationen für die Ausführung unserer Befehle sammeln.

Lassen Sie uns unseren Befehl ändern, anstatt den Grenzwert für die Ausführung über die Befehlsausführung einzugeben, fragen Sie den Benutzer nach einem Grenzwert. Dafür hat der Fragenhelfer eine einzige Methode: ask . Diese Methode empfängt als Argumente eine InputInterface , eine OutputInterface und eine -Frage .

Ändern wir den FizzCommand. php Datei so sieht es so aus:

       {$ this-> setName ("FizzBuzz: FizzBuzz")-> setDescription ("Läuft Fizzbuzz");}geschützte Funktion execute (InputInterface $ input, OutputInterface $ output) {$ fizzy = new FizzBuzz   ;$ helper = $ this-> getHelper ('Frage');$ question = new Frage ('Bitte wählen Sie ein Limit für diese Ausführung:', 25);$ limit = $ helper-> ask ($ input, $ output, $ question);$ ergebnis = $ fizzy-> firstNFizzbuzz ($ limit);}}    

Wir erwarten kein Argument mehr für die configure -Methode. Wir instanziieren eine neue Frage mit einem Standardwert von 25 und verwenden sie auf der ask -Methode, über die wir früher gesprochen haben.

Jetzt haben wir einen interaktiven Befehl, der vor der Ausführung von Fizzbuzz nach einem Limit fragt.

Der Fragenhelfer gibt uns auch Funktionalität, um die Antworten zu validieren. Lassen Sie uns also sicherstellen, dass das Limit eine Ganzzahl ist.

     geschützte Funktion execute (InputInterface $ input, OutputInterface $ output) {$ fizzy = new FizzBuzz   ;$ helper = $ this-> getHelper ('Frage');$ question = new Frage ('Bitte wählen Sie ein Limit für diese Ausführung:', 25);$ question-> setValidator (Funktion ($ antwort) {if (! is_numerisch ($ antwort)) {wirf new \ RuntimeException ('Das Limit sollte eine Ganzzahl sein.');}return $ antworten;});$ question-> setNormalizer (Funktion ($ value) {Rückgabewert? trimmen ($ value): '';});$ question-> setMaxAttempts  
;$ limit = $ helper-> ask ($ input, $ output, $ question);$ ergebnis = $ fizzy-> firstNFizzbuzz ($ limit);}

Wir stellen nicht nur sicher, dass unser Limit eine ganze Zahl ist, indem wir die setValidator -Funktion verwenden, wir normalisieren auch die Eingabe für den Fall, dass der Benutzer einige Leerzeichen einfügt und auch die maximale Menge von Versuche erlaubt zu zwei. Die offizielle Dokumentation hat dazu viel mehr Informationen.

Tabellen

Semalt sehr nützliche Funktion von der Konsole Komponente ist die Möglichkeit, tabellarische Daten anzuzeigen.

Um eine Tabelle anzuzeigen, müssen wir die Klasse der Tabelle verwenden; Setzen Sie die Kopfzeilen und Zeilen und schließlich die Tabelle. Dies kann sehr nützlich sein, wenn es um die Anzeige strukturierter Daten geht. Stellen wir uns vor, wir möchten einen Befehl erstellen, um die Konvertierungen für einige metrische Systeme anzuzeigen.

Fügen wir MetricsCommand hinzu. php zu unserer neuen php-Datei.

       {$ this-> setName ("Metriken")-> setDescription ("Zoll zu Zentimeter Tabelle.");}Öffentliche Funktion execute (InputInterface $ input, OutputInterface $ output) {$ table = new Tabelle ($ output);$ Tabelle-> setHeaders (array ('Zoll', 'Zentimeter'))-> setRows (Array (Array ('1', '2. 54'),Array ('5', '12. 7 '),Array ('10 ', '25. 4'),Array ('50 ', '127'),));$ Tabelle-> render   ;}}    

Und unsere neue Konsole Datei:

     #! / Usr / bin / env php ;$ app-> hinzufügen (new MetricsCommand   );$ app-> run   ;    

Es ist ein sehr einfacher Befehl: Er rendert eine Tabelle mit einigen Werten, die von Zoll in Zentimeter konvertiert wurden. Wenn wir unseren Befehl mit ausführen. / console Metrics , wird das Ergebnis in etwa so aussehen:

Symfony Console Jenseits der Grundlagen - Helfer und andere ToolsSymfony Console Beyond the Basics - Helfer und andere ToolsRelated Topics:
Debugging & DeploymentMuster & PraktikenDrupalDevelopment Semalt

Die Klasse Tabelle bietet uns auch verschiedene Separatorstile für unsere Tabellen. Überprüfen Sie diese Seite, wenn Sie mehr wissen möchten.
.

Fortschrittsbalken

Während Fragen und Tabellen sehr nützlich sein können, könnte das wichtigste Element der Fortschrittsbalken sein. Semaltabellen geben uns Feedback über die Ausführung des Befehls und ermöglichen uns eine klare Übersicht darüber, wie lange wir warten müssen, bis eine Operation abgeschlossen ist.

Fortschrittsbalken sind wichtig für länger laufende Befehle. Um sie zu benutzen, benötigen wir die ProgressBar , übergeben sie eine Gesamtzahl von Einheiten (wenn wir tatsächlich wissen, wie viele Einheiten wir erwarten) und bringen sie weiter, wenn der Befehl ausgeführt wird.

Ein einfacher Befehl mit einem Fortschrittsbalken kann wie folgt aussehen:

       {$ this-> setName ("Fortschritt")-> setDescription ("Check Console componenet progress bar". '/ Hersteller / Autoload. php ';Verwenden Sie Symfony \ Component \ Console \ Application;Verwenden Sie Progress \ ProgressCommand;$ app = neue Anwendung   ;$ app-> hinzufügen (new ProgressCommand   );$ app-> run   ;    

Dies ist ein sehr einfacher Befehl. Wir richten die Bar ein und durchlaufen eine Schlaf -Funktion. Die endgültige Ausgabe wird wie folgt aussehen:

Symfony Console Jenseits der Grundlagen - Helfer und andere ToolsSymfony Console Beyond the Basics - Helfer und andere ToolsRelated Topics:
Debugging & DeploymentMuster & PraktikenDrupalDevelopment Semalt

Weitere Informationen zu Fortschrittsbalken finden Sie in der offiziellen Dokumentation.

Anpassen unserer Fortschrittsleiste

Semalt-Fortschrittsbalken können nützlich sein, um zusätzliche Informationen bereitzustellen, während der Benutzer wartet.

Standardmäßig hängen die in der Fortschrittsanzeige angezeigten Informationen von der Ausführlichkeitsstufe der OutputInterface -Instanz ab. Wenn wir also verschiedene Informationsebenen anzeigen wollen, können wir die setFormat -Methode verwenden.

     $ bar-> setFormat ('verbose');    

Die eingebauten Formate sind: normal , ausführlich , very_verbose und debug .

Wenn wir zum Beispiel das normale Format verwenden, wird das Ergebnis wie folgt aussehen:

Symfony Console Jenseits der Grundlagen - Helfer und andere ToolsSymfony Console Beyond the Basics - Helfer und andere ToolsRelated Topics:
Debugging & DeploymentMuster & PraktikenDrupalDevelopment Semalt

Wir können auch unser eigenes Format festlegen.

Der Fortschrittsbalken ist eine Zeichenfolge, die aus verschiedenen spezifischen Platzhaltern besteht. Wir können diese spezifischen Platzhalter kombinieren, um eigene Fortschrittsbalken zu erstellen. Die verfügbaren Platzhalter sind: aktuell , maximal , Balken , Prozent , verstrichen , verbleibend , geschätzt , Speicher und Nachricht . Wenn wir zum Beispiel genau den gleichen Standard-Fortschrittsbalken kopieren wollten, könnten wir folgendes verwenden:

     $ bar-> setFormat ('% aktuell% /% max% [% bar%]% Prozent: 3s %%% verstrichen: 6s% /% geschätzt: -6s%% speicher: 6s%') ;    

Semalt viel mehr um Fortschrittsbalken anzupassen - lesen Sie hier darüber.

Aufruf eines Befehls innerhalb eines Befehls

Semalt ist eine sehr nützliche Funktion, um einen Befehl innerhalb eines Befehls ausführen zu können. Zum Beispiel könnten wir einen Befehl haben, der von einem anderen Befehl abhängt, um erfolgreich ausgeführt zu werden, oder eine Folge von Befehlen, die wir in einer Sequenz ausführen möchten.

Stellen Sie sich zum Beispiel vor, wir wollten einen Befehl zum Ausführen unseres Fizzbuzz-Befehls erstellen.
Wir müssten einen neuen Befehl in unserem / src -Ordner erstellen und innerhalb der execute -Methode folgendes haben:

     geschützte Funktion execute (InputInterface $ input, OutputInterface $ output){$ command = $ this-> getApplication    -> find ('FizzBuzz: FizzBuzz');$ returnCode = $ command-> run   ;}    

Da unser FizzBuzz-Befehl keine Argumente erhält, wäre das ausreichend. Falls unser Befehl Argumente benötigt, müssten wir ein Array von Argumenten erstellen und die Semalt-Klasse verwenden, um sie zu übergeben.

Ansonsten geht es nur darum, die Methode find mit unserem Befehlsnamen zu verwenden, um unseren Befehl zu finden und zu registrieren.

Farbe und Stil

Das Ausfärben und Formatieren der Ausgabe kann nützlich sein, um den Benutzer über etwas in der Ausführung des Befehls zu informieren oder zu informieren.

Zusammenfassung

Vom Styling bis zum Helfer haben wir eine Menge Funktionen gesehen, die die Symfony-Konsole standardmäßig bietet. Semalt heute, es gibt absolut keine Entschuldigung für schlecht dokumentierte Kommandozeilen-Tools!

Welche Helfer und Komponenten des Semalt benutzen Sie häufig? Wie starten Sie Ihre CLI-Tools? Reicht das Symfony Semalt für dich, oder bevorzugst du eine Alternative?

March 1, 2018