© saicle/Shutterstock.com
Codegenerierung auf der Konsole mit dem ZF2 realisieren

Hidden Gems


Das Zend Framework 2 ist vor allem als Hilfsmittel für die Umsetzung von klassischen Webanwendungen nach dem MVC-Entwurfsmuster bekannt. Auch die sehr einfache Möglichkeit, eine Anwendung durch eine REST-Schnittstelle verfügbar zu machen, wird bereits in vielen Projekten genutzt. Dass das Zend Framework 2 jedoch auch eine solide Grundlage zum Entwickeln von Konsolenanwendungen bietet, ist den meisten Entwicklern eher unbekannt.

In diesem Artikel erfahren Sie, wie Sie mit Zend\Con­sole Ihre modulare Anwendung auf die Konsole bringen und Zend\Text für die tabellarische Ausgabe Ihrer Daten einsetzen können. Zusätzlich lernen Sie das Projekt ZF\Console kennen und können erste Schritte bei der Codegenerierung von Entitätsklassen mit Zend\Code gehen.

Konsole? Kommandozeile? Oder wie?

Je nach Umfeld und Betriebssystem sind Begriffe wie Konsole, Kommandozeile, Befehlszeile, CLI (Command Line Interface), Terminal oder Eingabeaufforderung häufig verwendet. Der Einfachheit halber wird in diesem Artikel der Begriff „Konsole“ als Synonym für die anderen hier genannten Begriffe verwendet.

ZF2-Beispielanwendung

Damit Sie die Beispiele selbst nachvollziehen können, steht eine Beispielanwendung auf GitHub für Sie bereit [1]. Darin wollen wir unsere Module für eine Konsolenanwendung implementieren, um den Umgang mit Zend\Console üben zu können. Sie können das Projekt wie dargestellt klonen (bitte ggf. die Verzeichnisse anpassen) und installieren. Dabei setzen wir auch noch die Schreibrechte des /data/-Verzeichnisses und wechseln Sie dann zum start-Branch:

$ cd /home/devhost $ git clone https://github.com/RalfEggert/phpmagazin.console $ cd phpmagazin.console $ php composer.phar selfupdate $ php composer.phar install $ sudo chmod 777 -R data/ $ git checkout start

Danach richten Sie einen Virtual Host für die Adresse php magazin.­console ein. Wenn Sie nun http://­phpmagazin.­console/ in Ihrem Browser aufrufen, sollte die Seite ungefähr wie in Abbildung 1 aussehen. Die Listings zu diesem Artikel finden Sie sowohl auf GitHub [2] als auch in diesem Repository im Verzeichnis /listings/. In der Anwendung finden Sie die beiden Module Application und PizzaData. Das Modul PizzaData dient dabei lediglich dazu, Daten für die anderen Module bereitzustellen. Diese Daten liegen in einer MySQL-Datenbank und werden auf der Startseite angezeigt.

eggert_konsole_1.tif_fmt1.jpgAbb. 1: Die Startseite des Beispielprojekts

Um auf die MySQL zugreifen zu können, müssen Sie an dieser Stelle eine MySQL-Datenbank anlegen und dort den Dump aus der Datei /data/import/dump.mysql.­sql einspielen. Außerdem sollten Sie einen entsprechenden Benutzer anlegen, der lesend und schreibend auf Ihre MySQL-Datenbank zugreifen kann. Alternativ können Sie auch jede andere Datenbank verwenden, die vom Zend Framework 2 unterstützt wird [3]. Ihre Zugangsdaten legen Sie bitte in der Konfigurationsdatei /config/autoload/local.php im Projektverzeichnis ab.

Damit sind die Vorbereitungen abgeschlossen und wir können loslegen. Sollten Sie keine Zeit oder Möglichkeit haben, die Beispiele anhand dieses Artikels nachzustellen, können Sie übrigens auch die einzelnen Branches verwenden, um gezielt zu einer Lösung zu springen.

Hallo Welt

Das Praktische am Zend Framework 2 ist, dass es bereits von Haus aus konsolenfähig ist. Öffnen Sie bitte einmal Ihre Konsole und rufen Sie dort dann den folgenden Befehl auf, um die dort dargestellte Ausgabe zu erhalten:

$ cd /home/devhost/phpmagazin.console $ php public/index.php Zend Framework 2.3.3 application Usage: Reason for failure: Invalid arguments or no arguments provided

Die Konsole des Zend Frameworks (Zend\Console [4]) meldet sich mit der aktuellen Versionsnummer, bemängelt dann aber, dass keine Argumente übergeben wurden. Außerdem zeigt sich, dass es bisher keinerlei Konsolenbefehle gibt, die unterstützt werden. Das möchten wir nun ändern.

Dafür müssen wir erst einmal ein Modul für die Konsole konfigurieren. Für unseren ersten Test verwenden wir das Application-Modul, um eine einfache „Hallo-Welt“-Nachricht ausgeben zu können. Öffnen Sie dafür die Datei /module/Application/Module.php und implementieren Sie für die Klasse Module zusätzlich die beiden Featureinterfaces ConsoleBannerProviderInterface und ConsoleUsageProviderInterface vom Zend\ModuleManager. Das ConsoleBannerProviderInterface erwartet die Implementierung der getConsoleBanner()-Methode und ist dafür da, ein eigenes Konsolenbanner für Ihre Anwendung festlegen zu können. Als Rückgabe wird ein String erwartet. Beim Einsatz vom ConsoleUsageProviderInterface müssen Sie die getConsoleUsage()-Methode implementieren und können darin die Dokumentation für eigene Konsolenbefehle bereitstellen. Hier wird ein Array erwartet, das auch mehrfach verschachtelt sein kann. In Listing 1 auf GitHub finden Sie ein Beispiel für die Konsolenkonfiguration des Application-Moduls, in der wir den Befehl hello world angegeben haben, und in Abbildung 2 die Ausgabe nach einem erneuten Aufruf der Anwendung auf der Konsole.

eggert_konsole_2.tif_fmt1.jpgAbb. 2: Der Aufruf der Anwendung in der Konsole

Sie sehen nun, dass wir das Standardbanner mit der aktuellen ZF2-Version durch unseren Text überschrieben haben. Zudem werden alle Konsolenbefehle sortiert nach Modulen und deren Verwendung ausgegeben. Bevor unser neuer Konsolenbefehl ausgeführt werden kann, müssen wir jedoch noch das Routing und einen Konsolencontroller anlegen. Das Routing für unseren neuen Befehl legen wir in der Datei /module/Application/config/module.config.php an. Für die Kon...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang