18.3 Erweiterte Möglichkeiten 

Trotz der hier gezeigten Fülle an Features bieten die beiden Komponenten noch mehr. Bei der Komponente DatabaseSchema haben wir bisher absichtlich darauf verzichtet, die Backend-Handler zu betrachten. Wir wollen dies nun im Rahmen der Erweiterbarkeit der Komponente tun.
Auch im Bereich der Komponente ConsoleTools gibt es einige weitere Features zu entdecken, die im GP-Blog keine Verwendung fanden und auch im theoretischen Teil in Abschnitt 18.1, »Architektur«, nicht vorgestellt wurden. Darunter fallen die Konfiguration von Beziehungen zwischen den Optionen und das Anlegen eines Alias.
18.3.1 Beziehungen zwischen Optionen 

Zur Verwendung von Optionen mit der ezcConsoleInput-Klasse der ConsoleTools-Komponente haben Sie bereits Beispiele gesehen. Unberücksichtigt blieb dabei aber die Fähigkeit, Beziehungen zwischen den Optionen und in Bezug auf die Verwendung von Argumenten abzubilden.
Zu diesem Zweck stellen Instanzen von ezcConsoleOption Methoden bereit, die es Ihnen erlauben, Optionen untereinander auszuschließen oder Beziehungen zu beschreiben. Als Beispiel sei angenommen, dass Sie Ihren Benutzern zwei Methoden zur Verfügung stellen, die Optionen einer Datenbankverbindung anzugeben. Zum einen soll es möglich sein, den kompletten DSN mittels der Angaben -d oder --dsn anzugeben und zum anderen soll eine fiktive Konfigurationsdatei Informationen zu verschiedenen Datenbanken bereitstellen. Neben der Angabe dieser Datei über -c oder --config muss zusätzlich die Eingabe des Datenbanknamens über -n oder --name erfolgen.
Dabei schließen sich beide Varianten aus. Die zweite Variante erfordert, dass beide Parameter angegeben werden.
Diesen Anwendungsfall könnten Sie so abbilden:
$input = new ezcConsoleInput();
$helpOption = $input->registerOption(
new ezcConsoleOption( 'h', 'help' )
);
$dsnOption = $input->registerOption(
new ezcConsoleOption(
'd',
'dsn',
ezcConsoleInput::TYPE_STRING
)
);
$configOption = $input->registerOption(
new ezcConsoleOption(
'c',
'config',
ezcConsoleInput::TYPE_STRING
)
);
$nameOption = $input->registerOption( ;
new ezcConsoleOption(
'n',
'name',
ezcConsoleInput::TYPE_STRING
)
);
$configOption->addDependency(
new ezcConsoleOptionRule( $nameOption )
);
$nameOption->addDependency(
new ezcConsoleOptionRule( $configOption )
);
$dsnOption->addExclusion(
new ezcConsoleOptionRule( $configOption )
);
$dsnOption->addExclusion(
new ezcConsoleOptionRule( $nameOption )
);
$configOption->addExclusion(
new ezcConsoleOptionRule( $dsnOption )
);
$nameOption->addExclusion(
new ezcConsoleOptionRule( $dsnOption )
);Listing 18.17 Beziehungen zwischen Optionen konfigurieren
In diesem Beispiel wurden die soeben beschriebene Parameterkonstellation sowie eine weitere Option konfiguriert: Die Hilfeoption, die von den anderen Optionen völlig unabhängig ist.
Die hervorgehobenen Zeilen im Listing definieren in den Optionen-Objekten, wie diese zueinander in Beziehung stehen. Während die Optionen für die Konfiguration und den Namen der Datenbank einander benötigen, schließen beide die Übergabe der DSN-Option aus. Übergibt nun ein Anwender eine nicht erlaubte Kombination wie beispielsweise --dsn und -c an das Programm, wirft die process()-Methode des ezcConsoleInput-Objekts eine entsprechende Ausnahme: Zum Beispiel vom Typ ezcConsoleOptionDependencyViolationException, da die -c-Option ohne passendes -n angegeben wurde.
Die Verwendung von ezcConsoleOptionRule-Objekten an dieser Stelle ist überflüssig. Sie eröffnen Ihnen jedoch weitere Möglichkeiten, indem sie Beziehung auf bestimmte Werte von Parametern ermöglichen.
18.3.2 Optionsaliase 

In einigen Fällen kann es sinnvoll sein, dass Sie Optionen mit gleicher Bedeutung unter verschiedenen Namen bereitstellen. Ein Grund kann sein, dass eine Option in zwei Programmen unterschiedlich heißt und Sie es beiden Benutzergruppen erlauben wollen, sich »heimisch« zu fühlen. Ein anderer Grund könnte sein, dass Sie eine neue Ordnung für Ihre Optionen vorgesehen haben, Benutzer alter Varianten aber zunächst bei einem Update nicht »verärgern« wollen und daher vorerst die alten Optionen beibehalten. In beiden Fällen bieten Aliase, also Pseudooptionen, die lediglich auf eine echte Option verweisen, die Lösung.
Objekte vom Typ ezcConsoleInput stellen Ihnen zur Erzeugung eines Alias die Methode registerAlias() zur Verfügung. Diese erwartet zunächst den Kurz- und dann den Langnamen des neuen Alias sowie als dritten Parameter das Optionen-Objekt, auf das das Alias zeigt. Ein so erzeugtes Alias reagiert genauso wie sein Referenzparameter und füllt auch dessen Wertattribut entsprechend. Sie müssen sich also um das Alias selbst keine Sorgen machen und nur mit den eigentlichen Optionen arbeiten.
Analog zu der Deregistrierung echter Optionen, die vorher in diesem Kapitel gezeigt wurde, gibt es auch für Aliase eine Methode, um diese aufzuheben: unregisterAlias() erwartet als Parameter den Kurz- und Langnamen des zu zerstörenden Alias. Nach dem Aufruf kann das Alias vom Benutzer nicht mehr verwendet werden und taucht auch nicht mehr in der Hilfe auf.
Achten Sie aber darauf, nicht versehentlich ein Alias mit Hilfe der Methode unregisterOption() entfernen zu wollen oder umgekehrt eine Option mit der analogen Methode für Aliase. In beiden Fällen wird die ezcConsoleInput-Instanz mit einer Ausnahme reagieren.




Ihre Meinung






