| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 20807 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.tool.extending">
- <title>Zend_Tool erweitern</title>
- <sect2 id="zend.tool.extending.overview">
- <title>Übersicht über Zend_Tool</title>
- <para>
- <classname>Zend_Tool_Framework</classname> ist ein Framework für die Bereitstellung
- gemeinsamer Funktionalitäten wie die Erstellung von Projekthüllen, Code Erzeugung,
- Erstellung von Suchindezes, und noch mehr. Funktionalitäten können geschrieben und über
- <acronym>PHP</acronym> Klassen in den <acronym>PHP</acronym>
- <property>include_path</property> geworfen werden, was eine immense Flexibilität der
- Implementation liefert. Die Funktionalität kann dann verwendet werden indem eine
- Implementation geschrieben wird oder durch protokoll-spezifische Clients -- wie Konsolen
- Clients, <acronym>XML-RPC</acronym>, <acronym>SOAP</acronym>, und andere.
- </para>
- <para>
- <classname>Zend_Tool_Project</classname> baut auf die Möglichkeiten von
- <classname>Zend_Tool_Framework</classname> auf und erweitert diese um ein "Projekt" zu
- managen. Generell ist ein "Projekt" ein geplantes Ereignis oder eine Initiative. In der
- Computerwelt sind Projekte generell Sammlungen von Ressourcen. Diese Ressourcen können
- Dateien, Verzeichnisse, Datenbanken, Schematas, Bilder, Stile und anderes sein.
- </para>
- </sect2>
- <sect2 id="zend.tool.extending.zend-tool-framework">
- <title>Erweiterungen von Zend_Tool_Framework</title>
- <sect3 id="zend.tool.extending.zend-tool-framework.architecture">
- <title>Überblick der Architektur</title>
- <para>
- <classname>Zend_Tool_Framework</classname> bietet das folgende:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>Gemeinsame Interfaces und Abstraktes</emphasis> welche es
- Entwicklern erlauben Funktionalitäten und Möglichkeiten zu erstellen welche
- durch Tooling Clients verwendbar sind.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Grundsätzliche Client Funktionalität</emphasis> und eine konkrete
- Konsolenimplementation welche externe Tools und Interfaces mit
- <classname>Zend_Tool_Framework</classname> verbindet. Der Konsolenclient
- kann in <acronym>CLI</acronym> Umgebungen verwendet werden, wie Unix Shells
- und der Windows Konsole.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>"Provider" und "Manifest" Interfaces</emphasis> welche vom
- Toolingsystem verwendet werden können. "Provider" repräsentieren den
- funktionalen Aspekt des Frameworks, und definieren die Aktionen welche
- Tooling Clients aufrufen können. "Manifests" agieren als Metadaten
- Registrierungen welche zusätzlichen Kontext für die verschiedenen
- definierten Provider bieten.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Ein introspektives Ladesystem</emphasis> welches die Umgebung auf
- Provider scannt und erkennt was benötigt wird um Sie auszuführen.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Ein Standardset von System Provider</emphasis> welche dem System
- erlauben zu melden was die kompletten Möglichkeiten des Systems sind, und
- ein nützliches Feedback bieten. Das beinhaltet auch ein ausführliches
- "Hilfe System".
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Definitionen welche man in diesem Handbuch in Bezug auf
- <classname>Zend_Tool_Framework</classname> beachten sollte sind:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <classname>Zend_Tool_Framework</classname> - Der Framework welche die
- Tooling Möglichkeiten bereitstellt.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Tooling Client</emphasis> - Ein Entwickler-Tool welches sich zum
- <classname>Zend_Tool_Framework</classname> verbindet und Ihn verwendet.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Client</emphasis> - Das Subsystem von
- <classname>Zend_Tool_Framework</classname> welches ein Interface
- bereitstellt so das sich Tooling-Clienten verbinden, und Kommandos abfragen
- und ausführen können.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Konsolen Client / Kommandozeilen Interface /
- <filename>zf.php</filename></emphasis> - Der Tooling Client für die
- Kommandozeile.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Provider</emphasis> - Ein Subsystem und eine Sammlung von
- eingebauten Funktionalitäten welche der Framework exportiert.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Manifest</emphasis> - Ein Subsystem für die Definition,
- Organisation, und Verbreitung von Daten welche Provider benötigen.
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Tool_Project</classname> Provider - Ein Set von Providern
- speziell für die Erstellung und die Wartung von Zend Framework basierenden
- Projekten.
- </para>
- </listitem>
- </itemizedlist>
- </sect3>
- <sect3 id="zend.tool.extending.zend-tool-framework.cli-client">
- <title>Verstehen des CLI Clients</title>
- <para>
- Das <acronym>CLI</acronym>, oder Kommandozeilen-Tool (intern als das Konsolen-Tool
- bekannt) ist aktuell das primäre Interface für die Bearbeitung von
- <classname>Zend_Tool</classname> Anfragen. Mit dem <acronym>CLI</acronym> Tool
- können Entwickler Tooling-Anfragen im "Kommandozeilen-Fenster" behandeln,
- üblicherweise auch als "Terminal" Fenster bekannt. Diese Umgebung ist in einer *nix
- Umgebung vorherrschend, hat aber auch eine übliche Implementation in Windows mit
- <filename>cmd.exe</filename>, Console2 und mit dem Cygwin Projekt.
- </para>
- <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-general">
- <title>Das CLI Tool vorbereiten</title>
- <para>
- Um Tooling-Anfragen über den Kommandozeilen-Client auszuführen, muss man zuerst
- den Client vorbereiten so dass das System den "zf" Befehl ausführen kann. Der
- Kommandozeilen-Client ist, für alle Wünsche und Zwecke, die Datei
- <filename>.sh</filename> oder <filename>.bat</filename> welche mit der Zend
- Framework Distribution bereitgestellt wird. Im Trunk kann er hier gefunden
- werden: <ulink
- url="http://framework.zend.com/svn/framework/standard/trunk/bin/">http://framework.zend.com/svn/framework/standard/trunk/bin/</ulink>.
- </para>
- <para>
- Wie man sehen kann, gibt es 3 Dateien im <filename>/bin/</filename> Verzeichnis:
- <filename>zf.php</filename>, <filename>zf.sh</filename>, und
- <filename>zf.bat</filename>. <filename>zf.sh</filename> und
- <filename>zf.bat</filename> sind Betriebssystem-spezifische Client-Wrapper:
- <filename>zf.sh</filename> für die *nix Umgebung, und
- <filename>zf.bat</filename> für die Win32 Umgebung. Diese Client-Wrapper sind
- für das Finden der richtigen <filename>php.exe</filename>, das finden der
- <filename>zf.php</filename>, und die Übergabe an die Anfrage des Clients
- zuständig. Die <filename>zf.php</filename> ist verantwortlich für die
- Behandlung der Umgebung, die Erstellung des richtigen include_path, und der
- Übergabe von dem was auf der Kommandozeile angegeben wurde an die richtige
- Bibliothekskomponente für die Bearbeitung.
- </para>
- <para>
- Ultimativ, muss man zwei Dinge sicherstellen damit alles funktioniert,
- unabhängig vom Betriebssystem auf dem man arbeitet:
- </para>
- <orderedlist>
- <listitem>
- <para>
- <filename>zf.sh/zf.bat</filename> ist vom Systempfad aus erreichbar.
- Das ist die Fähigkeit <command>zf</command> von überall aus aufzurufen,
- unabhängig von aktuellen Arbeitsverzeichnisses.
- </para>
- </listitem>
- <listitem>
- <para>
- <filename>ZendFramework/library</filename> ist im
- <property>include_path</property>.
- </para>
- </listitem>
- </orderedlist>
- <note>
- <para>
- Zu beachten: Wärend das oben stehende sind die idealsten Notwendigkeiten
- sind, kann man einfach Zend Framework herunterladen und erwarten das es
- mit <filename>./path/to/zf.php</filename> und einem Kommando funktioniert.
- </para>
- </note>
- </sect4>
- <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-starnix">
- <title>Das CLI Tool auf Unix-artigen Systemen einrichten</title>
- <para>
- Das üblichste Setzup in einer *nix Umgebung ist es, <filename>zf.sh</filename>
- und <filename>zf.sh</filename> in das selbe Verzeichnis wie die
- <acronym>PHP</acronym> Bibliothek zu kopieren. Diese kann normalerweise in einem
- der folgenden Plätze gefunden werden:
- </para>
- <programlisting language="text"><![CDATA[
- /usr/bin
- /usr/local/bin
- /usr/local/ZendServer/bin/
- /Applications/ZendServer/bin/
- ]]></programlisting>
- <para>
- To find out the location of your <acronym>PHP</acronym> binary, you can execute
- 'which php' on the command line. This will return the location of the
- <acronym>PHP</acronym> binary you will be using to run <acronym>PHP</acronym>
- scripts in this environment.
- </para>
- <para>
- The next order of business is to ensure that Zend Framework
- library is set up correctly inside of the system <acronym>PHP</acronym>
- <property>include_path</property>. To find out where your
- <property>include_path</property> is located, you can execute
- <command>php -i</command> and look for the <property>include_path</property>
- variable, or more succinctly, execute
- <command>php -i | grep include_path</command>. Once you have found where
- your <property>include_path</property> is located (this will generally be
- something like <filename>/usr/lib/php</filename>,
- <filename>/usr/share/php</filename>, <filename>/usr/local/lib/php</filename>, or
- similar), ensure that the contents of the <filename>/library/</filename>
- directory are put inside your <property>include_path</property> specified
- directory.
- </para>
- <para>
- Once you have done those two things, you should be able to issue a
- command and get back the proper response like this:
- </para>
- <para>
- <inlinegraphic scale="100" align="center" valign="middle"
- fileref="figures/zend.tool.framework.cliversionunix.png" format="PNG" />
- </para>
- <para>
- If you do not see this type of output, go back and check your setup
- to ensure you have all of the necessary pieces in the proper place.
- </para>
- <para>
- There are a couple of alternative setups you might want to employ
- depending on your servers configuration, your level of access, or
- for other reasons.
- </para>
- <para>
- <emphasis>Alternative Setup</emphasis> involves keeping the Zend Framework
- download together as is, and creating a link from a <constant>PATH</constant>
- location to the <filename>zf.sh</filename>. What this means is you can
- place the contents of the ZendFramework download into a location
- such as <filename>/usr/local/share/ZendFramework</filename>, or more locally
- like <filename>/home/username/lib/ZendFramework</filename>, and creating a
- symbolic link to the <filename>zf.sh</filename>.
- </para>
- <para>
- Assuming you want to put the link inside <filename>/usr/local/bin</filename>
- (this could also work for placing the link inside
- <filename>/home/username/bin/</filename> for example) you would issue a
- command similar to this: </para>
- <programlisting language="sh"><![CDATA[
- ln -s /usr/local/share/ZendFramework/bin/zf.sh /usr/local/bin/zf
- # OR (for example)
- ln -s /home/username/lib/ZendFramework/bin/zf.sh /home/username/bin/zf
- ]]></programlisting>
- <para>
- This will create a link which you should be able to access globally
- on the command line.
- </para>
- </sect4>
- <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-windows">
- <title>Setting up the CLI tool on Windows</title>
- <para>
- The most common setup in the Windows Win32 environment, is to copy
- the <filename>zf.bat</filename> and <filename>zf.php</filename> into the same
- directory as your <acronym>PHP</acronym> binary. This can generally be found in
- one of the following places:
- </para>
- <programlisting language="text"><![CDATA[
- C:\PHP
- C:\Program Files\ZendServer\bin\
- C:\WAMP\PHP\bin
- ]]></programlisting>
- <para>
- You should be able to run <filename>php.exe</filename> on the command line.
- If you are not able to, first check the documentation that came with
- your <acronym>PHP</acronym> distribution, or ensure that the path to
- <filename>php.exe</filename> is in your
- Windows <constant>PATH</constant> environment variable.
- </para>
- <para>
- The next order of business is to ensure that Zend Framework
- library is set up correctly inside of the system <acronym>PHP</acronym>
- <property>include_path</property>. To find out where your
- <property>include_path</property> is located, you can type <command>php -i</command> and
- look for the <property>include_path</property> variable, or more succinctly
- execute <command>php -i | grep include_path</command> if you have Cygwin setup with
- grep available. Once you have found where your
- <property>include_path</property> is located (this will generally be
- something like <filename>C:\PHP\pear</filename>, <filename>C:\PHP\share</filename>,
- <filename>C:\Program%20Files\ZendServer\share</filename> or similar), ensure
- that the contents of the library/ directory are put inside your
- <property>include_path</property> specified directory.
- </para>
- <para>
- Once you have done those two things, you should be able to issue a
- command and get back the proper response like this:
- </para>
- <para>
- <inlinegraphic scale="100" align="center" valign="middle"
- fileref="figures/zend.tool.framework.cliversionwin32.png" format="PNG" />
- </para>
- <para>
- If you do not see this type of output, go back and check your setup
- to ensure you have all of the necessary pieces in the proper place.
- </para>
- <para>
- There are a couple of alternative setups you might want to employ
- depending on your server's configuration, your level of access, or
- for other reasons.
- </para>
- <para>
- <emphasis>Alternative Setup</emphasis> involves keeping the Zend
- Framework download together as is, and altering both your system
- <constant>PATH</constant> as well as the <filename>php.ini</filename> file.
- In your user's environment, make sure to add
- <filename>C:\Path\To\ZendFramework\bin</filename>, so that your
- <filename>zf.bat</filename> file is executable. Also, alter the
- <filename>php.ini</filename> file to ensure that
- <filename>C:\Path\To\ZendFramework\library</filename> is in your
- <property>include_path</property>.
- </para>
- </sect4>
- <sect4 id="zend.tool.extending.zend-tool-framework.cli-client.setup-othernotes">
- <title>Other Setup Considerations</title>
- <para>
- If for some reason you do not want Zend Framework library inside
- your <property>include_path</property>, there is another option. There are
- two special environment variables that <filename>zf.php</filename> will
- utilize to determine the location of your Zend Framework
- installation.
- </para>
- <para>
- The first is <constant>ZEND_TOOL_INCLUDE_PATH_PREPEND</constant>, which will
- prepend the value of this environment variable to the system
- (<filename>php.ini</filename>) <property>include_path</property> before loading the
- client.
- </para>
- <para>
- Alternatively, you might want to use
- <constant>ZEND_TOOL_INCLUDE_PATH</constant> to completely
- <emphasis>replace</emphasis> the system <property>include_path</property>
- for one that makes sense specifically for the <command>zf</command>
- command line tool.
- </para>
- </sect4>
- </sect3>
- <sect3 id="zend.tool.extending.zend-tool-framework.providers-and-manifests">
- <title>Creating Providers</title>
- <para>
- In general, a provider, on its own, is nothing more than the shell for a
- developer to bundle up some capabilities they wish to dispatch with the
- command line (or other) clients. It is an analogue to what a
- "controller" is inside of your <acronym>MVC</acronym> application.
- </para>
- <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.loading">
- <title>How Zend Tool finds your Providers</title>
- <para>
- By default Zend Tool uses the BasicLoader to find all
- the providers that you can run. It recursivly iterates all
- include path directories and opens all files that end
- with "Manifest.php" or "Provider.php". All classes in these
- files are inspected if they implement either
- <classname>Zend_Tool_Framework_Provider_Interface</classname>
- or <classname>Zend_Tool_Framework_Manifest_ProviderManifestable</classname>.
- Instances of the provider interface make up for the real functionality
- and all their public methods are accessible as provider actions.
- The ProviderManifestable interface however requires the implementation of a method
- <methodname>getProviders()</methodname> which returns an array of
- instantiated provider interface instances.
- </para>
- <para>
- The following naming rules apply on how you can access the providers
- that were found by the IncludePathLoader:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- The last part of your classname split by underscore is used
- for the provider name, e.g. "My_Provider_Hello" leads to your
- provider being accessible by the name "hello".
- </para>
- </listitem>
- <listitem>
- <para>
- If your provider has a method <methodname>getName()</methodname>
- it will be used instead of the previous method to determine
- the name.
- </para>
- </listitem>
- <listitem>
- <para>
- If your provider has "Provider" as prefix, e.g. it is called
- <classname>My_HelloProvider</classname> it will be stripped
- from the name so that the provider will be called "hello".
- </para>
- </listitem>
- </itemizedlist>
- <note>
- <para>The IncludePathLoader does not follow symlinks, that means
- you cannot link provider functionality into your include paths,
- they have to be physically present in the include paths.</para>
- </note>
- <example id="zend.tool.extending.zend-tool-framework.providers-and-manifests.loading.example">
- <title>Exposing Your Providers with a Manifest</title>
- <para>
- You can expose your providers to Zend Tool by offering a manifest
- with a special filename ending with "Manifest.php".
- A Provider Manifest is an implementation of the
- <interface>Zend_Tool_Framework_Manifest_ProviderManifestable</interface>
- and requires the <methodname>getProviders()</methodname> method to return
- an array of instantiated providers. In anticipation of our first
- own provider <classname>My_Component_HelloProvider</classname>
- we will create the following manifest:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_Manifest
- implements Zend_Tool_Framework_Manifest_ProviderManifestable
- {
- public function getProviders()
- {
- return array(
- new My_Component_HelloProvider()
- );
- }
- }
- ]]></programlisting>
- </example>
- </sect4>
- <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.basic">
- <title>Basic Instructions for Creating Providers</title>
- <para>
- As an example, if a developer wants to add the capability of showing
- the version of a datafile that his 3rd party component is working
- from, there is only one class the developer would need to implement.
- Assuming the component is called <classname>My_Component</classname>, he would
- create a class named <classname>My_Component_HelloProvider</classname> in a
- file named <filename>HelloProvider.php</filename> somewhere on the
- <property>include_path</property>. This class would implement
- <classname>Zend_Tool_Framework_Provider_Interface</classname>, and the body of
- this file would only have to look like the following:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- implements Zend_Tool_Framework_Provider_Interface
- {
- public function say()
- {
- echo 'Hello from my provider!';
- }
- }
- ]]></programlisting>
- <para>
- Given that code above, and assuming the developer wishes to access
- this functionality through the console client, the call would look
- like this:
- </para>
- <programlisting language="sh"><![CDATA[
- % zf say hello
- Hello from my provider!
- ]]></programlisting>
- </sect4>
- <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.response">
- <title>The response object</title>
- <para>
- As discussed in the architecture section Zend Tool allows to hook different clients for
- using your Zend Tool providers. To keep compliant with different clients you should
- use the response object to return messages from your providers instead of using
- <methodname>echo()</methodname> or a similiar output mechanism. Rewritting our hello
- provider with this knowledge it looks like:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- extends Zend_Tool_Framework_Provider_Abstract
- {
- public function say()
- {
- $this->_registry->getResponse
- ->appendContent("Hello from my provider!");
- }
- }
- ]]></programlisting>
- <para>
- As you can see one has to extend the <classname>Zend_Tool_Framework_Provider_Abstract</classname>
- to gain access to the Registry which holds the <classname>Zend_Tool_Framework_Client_Response</classname>
- instance.
- </para>
- </sect4>
- <sect4 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced">
- <title>Advanced Development Information</title>
- <sect5 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.variables">
- <title>Passing Variables to a Provider</title>
- <para>
- The above "Hello World" example is great for simple commands, but
- what about something more advanced? As your scripting and tooling
- needs grow, you might find that you need the ability to accept
- variables. Much like function signatures have parameters, your
- tooling requests can also accept parameters.
- </para>
- <para>
- Just as each tooling request can be isolated to a method within a
- class, the parameters of a tooling request can also be isolated in a
- very well known place. Parameters of the action methods of a
- provider can include the same parameters you want your client to
- utilize when calling that provider and action combination. For
- example, if you wanted to accept a name in the above example, you
- would probably do this in OO code:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- implements Zend_Tool_Framework_Provider_Interface
- {
- public function say($name = 'Ralph')
- {
- echo 'Hello' . $name . ', from my provider!';
- }
- }
- ]]></programlisting>
- <para>
- The above example can then be called via the command line
- <command>zf say hello Joe</command>. "Joe" will be supplied to the provider as
- a parameter of the method call. Also note, as you see that the
- parameter is optional, that means it is also optional on the command
- line, so that <command>zf say hello</command> will still work, and default
- to the name "Ralph".
- </para>
- </sect5>
- <sect5 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.prompt">
- <title>Prompt the User for Input</title>
- <para>
- There are cases when the workflow of your provider requires
- to prompt the user for input. This can be done by requesting
- the client to ask for more the required input by calling:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- extends Zend_Tool_Framework_Provider_Abstract
- {
- public function say($name = 'Ralph')
- {
- $nameResponse = $this->_registry
- ->getClient()
- ->promptInteractiveInput("Whats your name?");
- $name = $name->getContent();
- echo 'Hello' . $name . ', from my provider!';
- }
- }
- ]]></programlisting>
- <para>
- This command throws an exception if the current client is not
- able to handle interactive requests. In case of the default Console Client
- however you will be asked to enter the name.
- </para>
- </sect5>
- <sect5 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.pretendable">
- <title>Pretending to execute a Provider Action</title>
- <para>
- Another interesting feature you might wish to implement is
- <emphasis>pretendability</emphasis>. Pretendabilty is the ability
- for your provider to "pretend" as if it is doing the requested
- action and provider combination and give the user as much
- information about what it <emphasis>would</emphasis> do without
- actually doing it. This might be an important notion when doing
- heavy database or filesystem modifications that the user might not
- otherwise want to do.
- </para>
- <para>
- Pretendability is easy to implement. There are two parts to this
- feature: 1) marking the provider as having the ability to "pretend",
- and 2) checking the request to ensure the current request was indeed
- asked to be "pretended". This feature is demonstrated in the code
- sample below.
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- extends Zend_Tool_Framework_Provider_Abstract
- implements Zend_Tool_Framework_Provider_Pretendable
- {
- public function say($name = 'Ralph')
- {
- if ($this->_registry->getRequest()->isPretend()) {
- echo 'I would say hello to ' . $name . '.';
- } else {
- echo 'Hello' . $name . ', from my provider!';
- }
- }
- }
- ]]></programlisting>
- <para>
- To run the provider in pretend mode just call:
- </para>
- <programlisting language="sh"><![CDATA[
- % zf --pretend say hello Ralph
- I would say hello Ralph.
- ]]></programlisting>
- </sect5>
- <sect5 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.verbosedebug">
- <title>Verbose and Debug modes</title>
- <para>
- You can also run your provider actions in "verbose" or "debug" modes.
- The semantics in regard to this actions have to be implemented by you
- in the context of your provider. You can access debug or verbose modes
- with:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- implements Zend_Tool_Framework_Provider_Interface
- {
- public function say($name = 'Ralph')
- {
- if($this->_registry->getRequest()->isVerbose()) {
- echo "Hello::say has been called\n";
- }
- if($this->_registry->getRequest()->isDebug()) {
- syslog(LOG_INFO, "Hello::say has been called\n");
- }
- }
- }
- ]]></programlisting>
- </sect5>
- <sect5 id="zend.tool.extending.zend-tool-framework.providers-and-manifests.advanced.configstorage">
- <title>Accessing User Config and Storage</title>
- <para>
- Using the Enviroment variable <property>ZF_CONFIG_FILE</property> or the
- .zf.ini in your home directory you can inject configuration parameters into
- any Zend Tool provider. Access to this configuration is available via the
- registry that is passed to your provider if you extend
- <classname>Zend_Tool_Framework_Provider_Abstract</classname>.
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- extends Zend_Tool_Framework_Provider_Abstract
- {
- public function say()
- {
- $username = $this->_registry->getConfig()->username;
- if(!empty($username)) {
- echo "Hello $username!";
- } else {
- echo "Hello!";
- }
- }
- }
- ]]></programlisting>
- <para>
- The returned configuration is of the type
- <classname>Zend_Tool_Framework_Client_Config</classname> but internally the
- <methodname>__get()</methodname> and <methodname>__set()</methodname> magic methods
- proxy to a <classname>Zend_Config</classname> of the given configuration type.
- </para>
- <para>
- The storage allows to save arbitrary data for later reference. This can be useful for batch
- processing tasks or for re-runs of your tasks. You can access the storage in a similar way
- like the configuration:
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- extends Zend_Tool_Framework_Provider_Abstract
- {
- public function say()
- {
- $aValue = $this->_registry->getStorage()->get("myUsername");
- echo "Hello $aValue!";
- }
- }
- ]]></programlisting>
- <para>
- The API of the storage is very simple:
- </para>
- <programlisting language="php"><![CDATA[
- class Zend_Tool_Framework_Client_Storage
- {
- public function setAdapter($adapter);
- public function isEnabled();
- public function put($name, $value);
- public function get($name, $defaultValue=null);
- public function has($name);
- public function remove($name);
- public function getStreamUri($name);
- }
- ]]></programlisting>
- <important>
- <para>
- When designing your providers that are config or storage aware remember to
- check if the required user-config or storage keys really exist for a user.
- You won't run into fatal errors when none of these are provided though,
- since empty ones are created upon request.
- </para>
- </important>
- </sect5>
- </sect4>
- </sect3>
- </sect2>
- <sect2 id="zend.tool.extending.zend-tool-project">
- <title>Zend_Tool_Project Extensions</title>
- <para>
- Zend_Tool_Project exposes a rich set of functionality and capabilities that make the task
- of creating new providers, specficially those targetting project easier and more manageable.
- </para>
- <sect3 id="zend.tool.extending.zend-tool-project.architecture">
- <title>Overall Architecture</title>
- <para>
- This same concept applies to Zend Framework projects. In Zend Framework projects, you have
- controllers, actions, views, models, databases and so on and so forth. In terms of
- <classname>Zend_Tool</classname>, we need a way to track these types of resources - thus
- <classname>Zend_Tool_Project</classname>.
- </para>
- <para>
- <classname>Zend_Tool_Project</classname> is capable of tracking project resources throughout
- the development of a project. So, for example, if in one command you created a controller,
- and in the next command you wish to create an action within that controller,
- <classname>Zend_Tool_Project</classname> is gonna have to <emphasis>know</emphasis> about
- the controller file you created so that you can (in the next action), be able to append that
- action to it. This is what keeps our projects up to date and <emphasis>stateful</emphasis>.
- </para>
- <para>
- Another important point to understand about projects is that typically, resources are
- organized in a hierarchical fashion. With that in mind,
- <classname>Zend_Tool_Project</classname> is capable of serializing the current project into
- a internal representation that allows it to keep track of not only <emphasis>what</emphasis>
- resources are part of a project at any given time, but also <emphasis>where</emphasis> they
- are in relation to one another.
- </para>
- </sect3>
- <sect3 id="zend.tool.extending.zend-tool-project.providers">
- <title>Creating Providers</title>
- <para>
- Project specific providers are created in the same fashion as plain framework providers, with
- one exception: project providers must extend the <code>Zend_Tool_Project_Provider_Abstract</code>.
- This class comes with some significant functionality that helps developers load existing project,
- obtian the profile object, and be able to search the profile, then later store any changes to the
- current project profile.
- </para>
- <programlisting language="php"><![CDATA[
- class My_Component_HelloProvider
- extends Zend_Tool_Project_Provider_Abstract
- {
- public function say()
- {
- $profile = $this->_loadExistingProfile();
- /* ... do project stuff here */
- $this->_storeProfile();
- }
- }
- ]]></programlisting>
- </sect3>
- <!--
- <sect3 id="zend.tool.extending.zend-tool-project.resources-and-contexts">
- <title>Creating Resources & Contexts</title>
- </sect3>
- -->
- </sect2>
- </sect1>
|