1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21819 -->
4 <sect1 id="zend.tool.extending">
5 <title>Zend_Tool erweitern</title>
7 <sect2 id="zend.tool.extending.overview">
8 <title>Übersicht über Zend_Tool</title>
11 <classname>Zend_Tool_Framework</classname> ist ein Framework für die Bereitstellung
12 gemeinsamer Funktionalitäten wie die Erstellung von Projekthüllen, Code Erzeugung,
13 Erstellung von Suchindezes, und noch mehr. Funktionalitäten können geschrieben und über
14 <acronym>PHP</acronym> Klassen in den <acronym>PHP</acronym>
15 <property>include_path</property> geworfen werden, was eine immense Flexibilität der
16 Implementation liefert. Die Funktionalität kann dann verwendet werden indem eine
17 Implementation geschrieben wird oder durch protokoll-spezifische Clients -- wie Konsolen
18 Clients, <acronym>XML-RPC</acronym>, <acronym>SOAP</acronym>, und andere.
22 <classname>Zend_Tool_Project</classname> baut auf die Möglichkeiten von
23 <classname>Zend_Tool_Framework</classname> auf und erweitert diese um ein "Projekt" zu
24 managen. Generell ist ein "Projekt" ein geplantes Ereignis oder eine Initiative. In der
25 Computerwelt sind Projekte generell Sammlungen von Ressourcen. Diese Ressourcen können
26 Dateien, Verzeichnisse, Datenbanken, Schematas, Bilder, Stile und anderes sein.
30 <sect2 id="zend.tool.extending.zend-tool-framework">
31 <title>Erweiterungen von Zend_Tool_Framework</title>
33 <sect3 id="zend.tool.extending.zend-tool-framework.architecture">
34 <title>Überblick der Architektur</title>
37 <classname>Zend_Tool_Framework</classname> bietet das folgende:
43 <emphasis>Gemeinsame Interfaces und Abstraktes</emphasis> welche es
44 Entwicklern erlauben Funktionalitäten und Möglichkeiten zu erstellen welche
45 durch Tooling Clients verwendbar sind.
51 <emphasis>Grundsätzliche Client Funktionalität</emphasis> und eine konkrete
52 Konsolenimplementation welche externe Tools und Interfaces mit
53 <classname>Zend_Tool_Framework</classname> verbindet. Der Konsolenclient
54 kann in <acronym>CLI</acronym> Umgebungen verwendet werden, wie Unix Shells
55 und der Windows Konsole.
61 <emphasis>"Provider" und "Manifest" Interfaces</emphasis> welche vom
62 Toolingsystem verwendet werden können. "Provider" repräsentieren den
63 funktionalen Aspekt des Frameworks, und definieren die Aktionen welche
64 Tooling Clients aufrufen können. "Manifests" agieren als Metadaten
65 Registrierungen welche zusätzlichen Kontext für die verschiedenen
66 definierten Provider bieten.
72 <emphasis>Ein introspektives Ladesystem</emphasis> welches die Umgebung auf
73 Provider scannt und erkennt was benötigt wird um Sie auszuführen.
79 <emphasis>Ein Standardset von System Provider</emphasis> welche dem System
80 erlauben zu melden was die kompletten Möglichkeiten des Systems sind, und
81 ein nützliches Feedback bieten. Das beinhaltet auch ein ausführliches
88 Definitionen welche man in diesem Handbuch in Bezug auf
89 <classname>Zend_Tool_Framework</classname> beachten sollte sind:
96 <classname>Zend_Tool_Framework</classname> - Der Framework welche die
97 Tooling Möglichkeiten bereitstellt.
103 <emphasis>Tooling Client</emphasis> - Ein Entwickler-Tool welches sich zum
104 <classname>Zend_Tool_Framework</classname> verbindet und Ihn verwendet.
110 <emphasis>Client</emphasis> - Das Subsystem von
111 <classname>Zend_Tool_Framework</classname> welches ein Interface
112 bereitstellt so das sich Tooling-Clienten verbinden, und Kommandos abfragen
113 und ausführen können.
119 <emphasis>Konsolen Client / Kommandozeilen Interface /
120 <filename>zf.php</filename></emphasis> - Der Tooling Client für die
127 <emphasis>Provider</emphasis> - Ein Subsystem und eine Sammlung von
128 eingebauten Funktionalitäten welche der Framework exportiert.
134 <emphasis>Manifest</emphasis> - Ein Subsystem für die Definition,
135 Organisation, und Verbreitung von Daten welche Provider benötigen.
141 <classname>Zend_Tool_Project</classname> Provider - Ein Set von Providern
142 speziell für die Erstellung und die Wartung von Zend Framework basierenden
149 <sect3 id="zend.tool.extending.zend-tool-framework.cli-client">
150 <title>Verstehen des CLI Clients</title>
153 Das <acronym>CLI</acronym>, oder Kommandozeilen-Tool (intern als das Konsolen-Tool
154 bekannt) ist aktuell das primäre Interface für die Bearbeitung von
155 <classname>Zend_Tool</classname> Anfragen. Mit dem <acronym>CLI</acronym> Tool
156 können Entwickler Tooling-Anfragen im "Kommandozeilen-Fenster" behandeln,
157 üblicherweise auch als "Terminal" Fenster bekannt. Diese Umgebung ist in einer *nix
158 Umgebung vorherrschend, hat aber auch eine übliche Implementation in Windows mit
159 <filename>cmd.exe</filename>, Console2 und mit dem Cygwin Projekt.
162 <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-general">
163 <title>Das CLI Tool vorbereiten</title>
166 Um Tooling-Anfragen über den Kommandozeilen-Client auszuführen, muss man zuerst
167 den Client vorbereiten so dass das System den "zf" Befehl ausführen kann. Der
168 Kommandozeilen-Client ist, für alle Wünsche und Zwecke, die Datei
169 <filename>.sh</filename> oder <filename>.bat</filename> welche mit der Zend
170 Framework Distribution bereitgestellt wird. Im Trunk kann er hier gefunden
172 url="http://framework.zend.com/svn/framework/standard/trunk/bin/">http://framework.zend.com/svn/framework/standard/trunk/bin/</ulink>.
176 Wie man sehen kann, gibt es 3 Dateien im <filename>/bin/</filename> Verzeichnis:
177 <filename>zf.php</filename>, <filename>zf.sh</filename>, und
178 <filename>zf.bat</filename>. <filename>zf.sh</filename> und
179 <filename>zf.bat</filename> sind Betriebssystem-spezifische Client-Wrapper:
180 <filename>zf.sh</filename> für die *nix Umgebung, und
181 <filename>zf.bat</filename> für die Win32 Umgebung. Diese Client-Wrapper sind
182 für das Finden der richtigen <filename>php.exe</filename>, das finden der
183 <filename>zf.php</filename>, und die Übergabe an die Anfrage des Clients
184 zuständig. Die <filename>zf.php</filename> ist verantwortlich für die
185 Behandlung der Umgebung, die Erstellung des richtigen include_path, und der
186 Übergabe von dem was auf der Kommandozeile angegeben wurde an die richtige
187 Bibliothekskomponente für die Bearbeitung.
191 Ultimativ, muss man zwei Dinge sicherstellen damit alles funktioniert,
192 unabhängig vom Betriebssystem auf dem man arbeitet:
198 <filename>zf.sh/zf.bat</filename> ist vom Systempfad aus erreichbar.
199 Das ist die Fähigkeit <command>zf</command> von überall aus aufzurufen,
200 unabhängig von aktuellen Arbeitsverzeichnisses.
206 <filename>ZendFramework/library</filename> ist im
207 <property>include_path</property>.
214 Zu beachten: Wärend das oben stehende sind die idealsten Notwendigkeiten
215 sind, kann man einfach Zend Framework herunterladen und erwarten das es
216 mit <filename>./path/to/zf.php</filename> und einem Kommando funktioniert.
221 <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-starnix">
222 <title>Das CLI Tool auf Unix-artigen Systemen einrichten</title>
225 Das üblichste Setup in einer *nix Umgebung ist es, <filename>zf.sh</filename>
226 und <filename>zf.sh</filename> in das selbe Verzeichnis wie die
227 <acronym>PHP</acronym> Installation zu kopieren. Diese kann normalerweise in
228 einem der folgenden Plätze gefunden werden:
231 <programlisting language="text"><![CDATA[
234 /usr/local/ZendServer/bin/
235 /Applications/ZendServer/bin/
239 Um den Ort der eigenen <acronym>PHP</acronym> Installation zu finden kann man
240 'which php' auf der Kommandozeile ausführen. Das gibt den Ort der
241 <acronym>PHP</acronym> Installation zurück welche verwendet wird um in dieser
242 Umgebung <acronym>PHP</acronym> Skripte auszuführen.
246 Der nächste Schritt ist es sicherzustellen das die Zend Framework Bibliothek
247 korrekt im <acronym>PHP</acronym> <property>include_path</property> eingestellt
248 wurde. Um herauszufinden wo der <property>include_path</property> ist, kann man
249 <command>php -i</command> ausführen und nach der
250 <property>include_path</property> Variable sehen, oder kompakter
251 <command>php -i | grep include_path</command> ausführen. Sobald man
252 herausgefunden hat wo der <property>include_path</property> ist (er ist
253 normalerweise etwas wie <filename>/usr/lib/php</filename>,
254 <filename>/usr/share/php</filename>, <filename>/usr/local/lib/php</filename>,
255 oder so ähnlich), sollte man sicherstellen das der Inhalt des Verzeichnisses
256 <filename>/library/</filename> in einem der in <property>include_path</property>
257 spezifizierten Verzeichnisse ist.
261 Sobald man diese zwei Dinge getan hat, sollte man in der Lage sein ein Kommando
262 auszuführen und die richtige Antwort zurück zu erhalten, wie zum Beispiel:
266 <inlinegraphic scale="100" align="center" valign="middle"
267 fileref="figures/zend.tool.framework.cliversionunix.png" format="PNG" />
271 Wenn man diese Art der Ausgabe nicht sieht, sollte man zurückgeben und die
272 eigenen Einstellungen prüfen um sicherzustellen das man alle notwendigen Teile
273 am richtigen Ort vorhanden sind.
277 Es gibt eine Anzahl an alternativen Einstellungen die man erstellen kann,
278 abhängig von der Konfiguration des Servers, dem Zugriffslevel, oder aus anderen
283 Das <emphasis>alternative Setup</emphasis> enthält das man den Download vom Zend
284 Framework zusammenbehält wie er ist, und einen Link von einem
285 <constant>PATH</constant> Ort zur <filename>zf.sh</filename> erstellt. Was dies
286 bedeutet ist, dass man den Inhalt des Zend Framework Downloads in einem Ort wie
287 <filename>/usr/local/share/ZendFramework</filename> platzieren kann, oder
288 lokaler unter <filename>/home/username/lib/ZendFramework</filename> und einen
289 symbolischen Link zu <filename>zf.sh</filename> erstellt.
293 Angenommen man will den Link in <filename>/usr/local/bin</filename> platzieren
294 (dies könnte zum Beispiel auch für die Platzierung des Links unter
295 <filename>/home/username/bin/</filename> funktionieren), dan würde man ein
296 Kommando wie das folgende platzieren:
299 <programlisting language="sh"><![CDATA[
300 ln -s /usr/local/share/ZendFramework/bin/zf.sh /usr/local/bin/zf
302 # ODER (zum Beispiel)
303 ln -s /home/username/lib/ZendFramework/bin/zf.sh /home/username/bin/zf
307 Das erstellt einen Link auf den man global von der Kommandozeile aus zugreifen
312 <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-windows">
313 <title>Das CLI Tool unter Windows einrichten</title>
316 Das üblichste Setup in einer Windows Win32 Umgebung ist es
317 <filename>zf.bat</filename> und <filename>zf.php</filename> in das selbe
318 Verzeichnis wie die <acronym>PHP</acronym> Bibliothek zu kopieren. Diese kann
319 generell an einem der folgenden Plätze gefunden werden:
322 <programlisting language="text"><![CDATA[
324 C:\Program Files\ZendServer\bin\
329 Man sollte in der Lage sein <filename>php.exe</filename> von der Kommandozeile
330 aus auszuführen. Wenn man dazu nicht in der Lage ist, sollte man zuerst die
331 Dokumentation prüfen welche mit der <acronym>PHP</acronym> Bibliothek
332 mitgeliefert wird, um sicherzustellen dass der Pfad zu
333 <filename>php.exe</filename> in der Windows Umgebungsvariable
334 <constant>PATH</constant> zu finden ist.
338 Der nächste Schritt besteht darin sicherzustellen das die Zend Framework
339 Bibliothek richtig auf dem <acronym>PHP</acronym>
340 <property>include_path</property> des Systems eingerichtet ist. Um
341 herauszufinden wo der <property>include_path</property> ist, kann man
342 <command>php -i</command> eingeben und nach der Variable
343 <property>include_path</property> sehen, oder kompakter
344 <command>php -i | grep include_path</command> ausführen wenn man ein Cygwin
345 Setup mit vorhandenem grep hat. Sobald man herausgefunden hat wo der
346 <property>include_path</property> liegt (das ist normalerweise etwas wie
347 <filename>C:\PHP\pear</filename>, <filename>C:\PHP\share</filename>,
348 <filename>C:\Program%20Files\ZendServer\share</filename>, oder ähnlich), sollte
349 man sicherstellen das der Inhalt des Verzeichnisses library/ in einem vom
350 <property>include_path</property> spezifizierten Verzeichnis ist.
354 Sobald man diese zwei Dinge getan hat, sollte man in der Lage sein ein Kommando
355 auszuführen und die richtige Antwort, so ähnlich wie die folgende, zu erhalten:
359 <inlinegraphic scale="100" align="center" valign="middle"
360 fileref="figures/zend.tool.framework.cliversionwin32.png" format="PNG" />
364 Wenn man diese Art der Ausgabe nicht sieht, sollte man zurückgehen und die
365 Einstellungen prüfen um sicherzustellen das man alle notwendigen Teile an den
370 Es gibt eine Anzahl an alternativen Einstellungen die man erstellen kann,
371 abhängig von der Konfiguration des Servers, dem Zugriffslevel, oder aus anderen
376 Das <emphasis>alternative Setup</emphasis> enthält das man den Download vom Zend
377 Framework zusammenbehält wie er ist, und sowohl den System
378 <constant>PATH</constant>, als auch die <filename>php.ini</filename> Datei
379 verändert. In der Umgebung des Benutzers muss man
380 <filename>C:\Path\To\ZendFramework\bin</filename> hinzufügen damit die Datei
381 <filename>zf.bat</filename> ausführbar ist. Auch die Datei
382 <filename>php.ini</filename> ist zu verändern um sicherzustellen das
383 <filename>C:\Path\To\ZendFramework\library</filename> im
384 <property>include_path</property> liegt.
388 <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-othernotes">
389 <title>Andere Einstellungs-Möglichkeiten</title>
392 Wenn man aus bestimmten Gründen die Zend Framework Bibliothek nicht im
393 <property>include_path</property> haben will, gibt es andere Optionen. Es gibt
394 zwei spezielle Umgebungsvariablen welche <filename>zf.php</filename> verwendet
395 um den Ort der Zend Framework Installation zu erkennen.
399 Die erste ist <constant>ZEND_TOOL_INCLUDE_PATH_PREPEND</constant>, welche den
400 Wert der Umgebungsvariable dem <property>include_path</property> des Systems
401 (<filename>php.ini</filename>) voranstellt bevor der Client geladen wird.
405 Alternativ kann man <constant>ZEND_TOOL_INCLUDE_PATH</constant> verwenden um den
406 <property>include_path</property> des System komplett zu
407 <emphasis>ersetzen</emphasis> für jene bei denen es Sinn macht, speziell für das
408 <command>zf</command> Kommandozeilen-Tool.
413 <sect3 id="zend.tool.extending.zend-tool-framework.providers-and-manifests">
414 <title>Erstellen von Providern</title>
417 Generell, ist ein Provider für sich selbst gesehen, nichts weiter als eine Shell für
418 einen Entwickler um einige Möglichkeiten zu bündeln welche er mit den Kommandozeilen
419 (oder anderen) Clients ausführen will. Das ist eine Analogie für das was der
420 "Controller" in der <acronym>MVC</acronym> Anwendung ist.
423 <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.loading">
424 <title>Wie Zend_Tool eigene Provider findet</title>
427 Standardmäßig verwendet <classname>Zend_Tool</classname> den BasicLoader um alle
428 Provider zu finden die es ausführen kann. Er durchsucht alle Verzeichnisse des
429 Include Pfades rekursiv und öffnet alle Dateien welche mit "Manifest.php" oder
430 "Provider.php" enden. Alle Klassen in diesen Dateien werden darauf durchsucht ob
431 Sie entweder <classname>Zend_Tool_Framework_Provider_Interface</classname> oder
432 <classname>Zend_Tool_Framework_Manifest_ProviderManifestable</classname>
433 implementieren. Instanzen des Provider Interfaces sind für die echte
434 Funktionalität zuständig und alle Ihre öffentlichen Methoden kann als Provider
435 Aktionen zugegriffen werden. Das ProviderManifestable Interface benötigt
436 trotzdem die Implementation einer <methodname>getProviders()</methodname>
437 Methode welche ein Array an instanzierten Provider Interface Instanzen
442 Die folgenden Namensregeln sind darauf anzuwenden, wie man auf die Provider
443 zugreifen kann welche vom IncludePathLoader gefunden werden:
449 Der letzte Teil des eigenen Klassennamens welcher von einem Unterstrich
450 getrennt ist, wird für den Providernamen verwendet, zum Beispiel führt
451 "My_Provider_Hello" zum Provider auf welchen mit dem Namen "hello"
452 zugegriffen werden kann.
458 Wenn der Provider eine Methode <methodname>getName()</methodname> hat,
459 dann wird diese verwendet statt der vorherigen Methode um den Namen zu
466 Wenn der Provider den Präfix "Provider" hat, zum Beispiel wenn er
467 <classname>My_HelloProvider</classname> heißt, dann wird er vom Namen
468 entfernt so dass der Provider "hello" heißt.
475 Der IncludePathLoader folgt Symlinks nicht, was bedeutet das man Provider
476 Funktionalitäten nicht in den Include Pfaden verlinken kann, sondern dass
477 Sie physikalisch in den Include Pfaden vorhanden sein müssen.
482 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.loading.example">
483 <title>Provider mit einem Manifest bekanntmachen</title>
486 Man kann eigene Provider bei <classname>Zend_Tool</classname> bekannt machen
487 indem man ein Manifest anbietet, mit einer speziellen Endung des Dateinamens
488 von "Manifest.php". Ein Provider-Manifest ist eine Implementation von
489 <interface>Zend_Tool_Framework_Manifest_ProviderManifestable</interface> und
490 benötigt die <methodname>getProviders()</methodname> Methode um ein Array
491 von instanziierten Providern zurückzugeben. Anders als unser erster eigener
492 Provider <classname>My_Component_HelloProvider</classname> erstellen wir das
496 <programlisting language="php"><![CDATA[
497 class My_Component_Manifest
498 implements Zend_Tool_Framework_Manifest_ProviderManifestable
500 public function getProviders()
503 new My_Component_HelloProvider()
512 <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.basic">
513 <title>Grundsätzliche Instruktionen für die Erstellung von Providern</title>
516 Wenn, als Beispiel, ein Entwickler die Fähigkeit, eine Version einer Datendatei
517 anzuzeigen, hinzufügen will mit der seine 3rd Party Komponente arbeitet, gibt es
518 nur eine Klasse welche der Entwickler implementieren muss. Angenommen die
519 Komponente wird <classname>My_Component</classname> genannt, dann würde er eine
520 Klasse erstellen welche <classname>My_Component_HelloProvider</classname> heißt
521 in einer Datei wleche <filename>HelloProvider.php</filename> genannt ist und
522 irgendwo in seinem <property>include_path</property> liegt. Diese Klasse würde
523 <classname>Zend_Tool_Framework_Provider_Interface</classname> implementieren und
524 diese Datei würde etwa wie folgt auszusehen haben:
527 <programlisting language="php"><![CDATA[
528 class My_Component_HelloProvider
529 implements Zend_Tool_Framework_Provider_Interface
531 public function say()
533 echo 'Hallo von meinem Provider!';
539 Bei dem obigen Code und der Annahme das der Entwickler Zugriff auf diese
540 Funktionalität über den Konsolen-Client haben will, würde der Aufruf wie folgt
544 <programlisting language="sh"><![CDATA[
546 Hallo von meinem Provider!
550 <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.response">
551 <title>Das Antwort-Objekt</title>
554 Wie im Architektur-Abschnitt diskutiert erlaubt es
555 <classname>Zend_Tool</classname> andere Clients für die Verwendung eigener
556 <classname>Zend_Tool</classname> Provider zu verknüpfen. Um den
557 unterschiedlichen Clients zu entsprechen sollte man das Antwort-Objekt verwenden
558 um Rückgabe-Meldungen von Providern zurückzugeben anstatt
559 <methodname>echo()</methodname> oder ähnliche Ausgabe-Mechanismen zu verwenden.
560 Nach dem Umschreiben des Hello-Providers mit diesen Erkenntnissen sieht er wie
564 <programlisting language="php"><![CDATA[
565 class My_Component_HelloProvider
566 extends Zend_Tool_Framework_Provider_Abstract
568 public function say()
570 $this->_registry->getResponse
571 ->appendContent("Hallo von meinem Provider!");
577 Wie man sieht muss <classname>Zend_Tool_Framework_Provider_Abstract</classname>
578 erweitert werden um Zugriff auf die Registry zu erhalten welche die
579 <classname>Zend_Tool_Framework_Client_Response</classname> Instanz enthält.
583 <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced">
584 <title>Fortgeschrittene Informationen für die Entwicklung</title>
587 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.variables">
588 <title>Variablen an einen Provider übergeben</title>
591 Das obige "Hello World" Beispiel ist großartig für einfache Befehle, aber
592 was ist mit etwas komplizierterem? Wenn die eigenen Skripting- und
593 Tooling-Bedürfnisse wachsen kann man die Notwendigkeit sehen dass man
594 Variablen akzeptiert. So wie Funktions-Signaturen Parameter haben, so können
595 eigene Tooling-Anfragen auch Parmeter akzeptieren.
599 So wie jede Tooling-Anfrage isoliert von einer Methode in einer Klasse sein
600 kann, können auch die Parameter einer Tooling-Anfrage in einem sehr
601 bekanntem Platz isoliert sein. Parameter einer Aktions-Methode eines
602 Providers können die selben Parameter enthalten welche der eigene Client
603 verwenden soll wenn diese Provider und Aktions-Methode aufgerufen wird.
604 Wenn man zum Beispiel einen Namen im oben stehenden Beispiel akzeptieren
605 will, würde man möglicherweise folgendes in OO Code machen:
608 <programlisting language="php"><![CDATA[
609 class My_Component_HelloProvider
610 implements Zend_Tool_Framework_Provider_Interface
612 public function say($name = 'Ralph')
614 echo 'Hallo' . $name . ', von meinem Provider!';
620 Das obige Beispiel kann dann über die Kommandozeile
621 <command>zf say hello Joe</command> aufgerufen werden. "Joe" wird dem
622 Provider bereitgestellt so wie ein Parameter eines Methodenaufrufs. Es ist
623 auch zu beachten das der Parameter optional ist, was bedeutet das er auch
624 in der Kommandozeile optional ist, so dass
625 <command>zf say hello</command> trotzdem noch funktioniert, und auf den
626 Standardwert "Ralph" zeigt.
631 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.prompt">
632 <title>Den Benutzer nach einer Eingabe fragen</title>
635 Es gibt Fälle in denen der Workflow des eigenen Providers es notwendig macht
636 den Benutzer nach einer Eingabe zu fragen. Dies kann getan werden indem der
637 Client nach einer zusätzlich benötigten Eingabe gefragt wird indem folgendes
641 <programlisting language="php"><![CDATA[
642 class My_Component_HelloProvider
643 extends Zend_Tool_Framework_Provider_Abstract
645 public function say($name = 'Ralph')
647 $nameResponse = $this->_registry
649 ->promptInteractiveInput("Wie ist dein Name?");
650 $name = $name->getContent();
652 echo 'Hallo' . $name . ', von meinem Provider!';
658 Dieses Kommando wirft eine Ausnahme wenn der aktuelle Client nicht in der
659 Lage ist interaktive Anfragen zu behandeln. Im Falle des standardmäßigen
660 Konsolen-Clients wird man aber danach gefragt den Namen einzugeben.
665 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.pretendable">
666 <title>Die Ausführung einer Provider-Aktion vorbereiten</title>
669 Ein anderes interessantes Feature das man möglicherweise implementieren will
670 ist die <emphasis>Vorbereitung</emphasis>. Vorbereitung ist die Fähigkeit
671 des eigenen Providers sich "vorzubereiten", wie wenn er die angefragte
672 Kombination von Aktion und Provider durchführt und dem Benutzer so viele
673 Informationen wie möglich darüber zu geben was er tun
674 <emphasis>würde</emphasis> ohne es wirklich zu tun. Das kann ein wichtiger
675 Hinweis sein wenn große Änderungen in der Datenbank oder auf dem Dateisystem
676 durchgeführt werden welche der Benutzer andernfalls nicht durchführen wollen
681 Voranstellbarkeit ist einfach zu implementieren. Es gibt zwei Teile zu
682 diesem Feature: 1) Den Provider markieren, das er die Fähigkeit hat
683 "vorzubereiten", und 2) die Anfrage prüfen und sicherstellen das die
684 aktuelle Anfrage wirklich als "vorzubereiten" angefragt wurde. Dieses
685 Feature wird im folgenden Code-Beispiel demonstriert.
688 <programlisting language="php"><![CDATA[
689 class My_Component_HelloProvider
690 extends Zend_Tool_Framework_Provider_Abstract
691 implements Zend_Tool_Framework_Provider_Pretendable
693 public function say($name = 'Ralph')
695 if ($this->_registry->getRequest()->isPretend()) {
696 echo 'Ich würde Hallo zu ' . $name . ' sagen.';
698 echo 'Hallo' . $name . ', von meinem Provider!';
705 Um den Provider im vorbereiteten Modus auszuführen muss nur folgendes
709 <programlisting language="sh"><![CDATA[
710 % zf --pretend say hello Ralph
711 Ich würde Hallo zu Ralph sagen.
716 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.verbosedebug">
717 <title>Verbose und Debug Modi</title>
720 Man kann Provider Aktionen auch in den Modi "verbose" oder "debug" laufen
721 lassen. Die Semantik bezüglich dieser Aktionen muss man im Kontext des
722 Providers implementieren. Man kann auf die Modi Debug oder Verbose wie
726 <programlisting language="php"><![CDATA[
727 class My_Component_HelloProvider
728 implements Zend_Tool_Framework_Provider_Interface
730 public function say($name = 'Ralph')
732 if($this->_registry->getRequest()->isVerbose()) {
733 echo "Hello::say wurde aufgerufen\n";
735 if($this->_registry->getRequest()->isDebug()) {
736 syslog(LOG_INFO, "Hello::say wurde aufgerufen\n");
744 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.configstorage">
745 <title>Auf die Benutzerkonfiguration und den Speicher zugreifen</title>
748 Bei Verwendung der Umgebungsvariable <property>ZF_CONFIG_FILE</property>
749 oder von .zf.ini im Heimverzeichnis können Konfigurationsparameter in jeden
750 <classname>Zend_Tool</classname> Provider eingefügt werden. Der Zugriff auf
751 diese Konfiguration ist über die Registry möglich welche dem Provider
752 übergeben wird wenn man
753 <classname>Zend_Tool_Framework_Provider_Abstract</classname> erweitert.
756 <programlisting language="php"><![CDATA[
757 class My_Component_HelloProvider
758 extends Zend_Tool_Framework_Provider_Abstract
760 public function say()
762 $username = $this->_registry->getConfig()->username;
763 if(!empty($username)) {
764 echo "Hallo $username!";
773 Die zurückgegebene Konfiguration ist vom Typ
774 <classname>Zend_Tool_Framework_Client_Config</classname> allerdings
775 verweisen die magischen Methoden <methodname>__get()</methodname> und
776 <methodname>__set()</methodname> intern auf eine
777 <classname>Zend_Config</classname> oder den angegebenen Konfigurationstyp.
781 Der Speicher erlaubt es notwendige Daten für eine spätere Referenz zu
782 speichern. Das kann für Aufgaben bei der Ausführung von Batches nützlich
783 sein oder für das wiederausführen von Aufgaben. Man kann auf den Speicher
784 auf dem gleichen Weg zugreifen wie auf die Konfiguration:
787 <programlisting language="php"><![CDATA[
788 class My_Component_HelloProvider
789 extends Zend_Tool_Framework_Provider_Abstract
791 public function say()
793 $aValue = $this->_registry->getStorage()->get("myUsername");
794 echo "Hallo $aValue!";
800 Die <acronym>API</acronym> des Speichers ist sehr einfach:
803 <programlisting language="php"><![CDATA[
804 class Zend_Tool_Framework_Client_Storage
806 public function setAdapter($adapter);
807 public function isEnabled();
808 public function put($name, $value);
809 public function get($name, $defaultValue=null);
810 public function has($name);
811 public function remove($name);
812 public function getStreamUri($name);
818 Wenn man Provider erstellt welche Konfigurations-fähig oder
819 Speicher-fähig sind muss man daran denken dass man prüfen muss ob die
820 notwendigen Benutzerkonfigurations- oder Speicher-Schlüssel wirklich
821 für diesen Benutzer existieren. Man wird keine fatalen Fehler erhalten
822 wenn keiner von Ihnen angegeben wurde, da leere Schlüssel bei der
823 Anfrage erstellt werden.
831 <sect2 id="zend.tool.extending.zend-tool-project">
832 <title>Zend_Tool_Project Erweiterungen</title>
835 Zend_Tool_Project bietet ein reiches Set an Funktionalitäten und Möglichkeiten welche
836 die Aufgabe der Erstellung neuer Provider, speziell jener welche auf ein Projekt
837 abzielen, einfacher und besser managebar.
840 <sect3 id="zend.tool.extending.zend-tool-project.architecture">
841 <title>Architektur-Übersicht</title>
844 Das selbe Konzept gilt auch für Zend Framework Projekte. In Zend Framework Projekten
845 hat man Controller, Aktionen, Views, Modelle, Datenbanken und so weiter. Im Sinn
846 von <classname>Zend_Tool</classname> benötigen wir einen Weg um diese Arten von
847 Ressourcen zu verfolgen -- deshalb <classname>Zend_Tool_Project</classname>.
851 <classname>Zend_Tool_Project</classname> ist in der Lage Projektressourcen wärend
852 der Entwicklung eines Projekts zu verfolgen. Wenn man, zum Beispiel, in einem
853 Kommando einen Controller erstellt, und im nächsten Kommando eine Aktion in diesem
854 Controller erstellen will, muss <classname>Zend_Tool_Project</classname> über die
855 Controllerdatei bescheid <emphasis>wissen</emphasis> die man erstellt hat, damit
856 man (in der nächsten Aktion) in der Lage ist diese Aktion daran anzuhängen. Das ist
857 was das Projekt aktuell hält und <emphasis>zustandsbehaftet</emphasis>.
861 Ein andere wichtiger Punkt den man über Projekte verstehen sollte ist, dass
862 Ressourcen typischerweise in einer hierarchischen Art orgainisiert sind. Dies zu
863 wissen bedeutet das <classname>Zend_Tool_Project</classname> in der Lage ist das
864 aktuelle Projekt in eine interne Repräsentation zu serialisieren welche es erlaubt
865 nicht nur jederzeit festzustellen <emphasis>welche</emphasis> Ressourcen Teil eines
866 Projekts sind, sondern auch <emphasis>wo</emphasis> Sie in Relation zu anderen
871 <sect3 id="zend.tool.extending.zend-tool-project.providers">
872 <title>Provider erstellen</title>
875 Projektspezifische Provider werden auf dem selben Weg erstellt wie reine Framework
876 Provider, mit einer Ausnahme: Projektprovider müssen
877 <code>Zend_Tool_Project_Provider_Abstract</code> erweitern. Diese Klasse kommt mit
878 einigen signifikanten Funktionalitäten welche Entwicklern helfen existierende
879 Projekte zu laden, das Profilobjekt zu erhalten, und in der Lage zu sein das Profil
880 zu suchen, und später dann alle Änderungen im aktuellen Projektprofil zu speichern.
883 <programlisting language="php"><![CDATA[
884 class My_Component_HelloProvider
885 extends Zend_Tool_Project_Provider_Abstract
887 public function say()
889 $profile = $this->_loadExistingProfile();
891 /* ... Projektarbeiten hier durchführen */
893 $this->_storeProfile();
900 <sect3 id="zend.tool.extending.zend-tool-project.resources-and-contexts">
901 <title>Creating Resources & Contexts</title>