| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="migration.06">
- <title>Zend Framework 0.6</title>
- <para>
- Wenn man von einem älteren Release auf Zend Framework 0.6 oder höher hochrüstet sollte
- man die folgenden Migrations Hinweise beachten.
- </para>
- <sect2 id="migration.06.zend.controller">
- <title>Zend_Controller</title>
- <para>
- Die grundlegende Verwendung der <acronym>MVC</acronym> Komponenten hat sich nicht
- verändert; man kann immer noch das folgende machen:
- </para>
- <programlisting language="php"><![CDATA[
- require_once 'Zend/Controller/Front.php';
- Zend_Controller_Front::run('/path/to/controllers');
- ]]></programlisting>
- <programlisting language="php"><![CDATA[
- /* -- Erstelle einen Router -- */
- $router = new Zend_Controller_RewriteRouter();
- $router->addRoute('user',
- 'user/:username',
- array('controller' => 'user', 'action' => 'info')
- );
- /* -- Setze ihn im Controller -- */
- $ctrl = Zend_Controller_Front::getInstance();
- $ctrl->setRouter($router);
- /* -- Setze da Controller Verzeichnis und starte die Verarbeitung -- */
- $ctrl->setControllerDirectory('/path/to/controllers');
- $ctrl->dispatch();
- ]]></programlisting>
- <para>
- Wir empfehlen die Verwendung des Response Objektes, um Inhalte und Header zu sammeln.
- Dies erlaubt den flexibleren Wechsel von Ausgabeformaten (z.B. <acronym>JSON</acronym>
- oder <acronym>XML</acronym> statt <acronym>XHTML</acronym>) in deiner Applikation.
- Standardmäßig verarbeitet <methodname>dispatch()</methodname> die Antwort, sendet
- Header und gibt die Inhalte aus. Man kann den Front Controller auch auffordern, die
- Antwort durch <methodname>returnResponse()</methodname> zurückzugeben und die Antwort
- dann auf eigene Weise ausgeben. Eine zukünftige Version des Front Controllers könnte
- die Verwendung des Response Objektes durch Output Buffering erzwingen.
- </para>
- <para>
- Es gibt viele weitere zusätzliche Funktionalitäten, welche die vorherige
- <acronym>API</acronym> erweitern. Diese sind in der Dokumentation aufgeführt.
- </para>
- <para>
- Die meisten Änderungen, die man beachten muss, betreffen das Erweitern der diversen
- Komponenten. Die wichtigsten davon sind:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>Zend_Controller_Front::dispatch()</methodname> fängt standardmäßig
- die Ausnahmen im Response Objekt ab und gibt sie nicht aus, um sicherzugehen,
- dass keine sensitiven Systeminformationen ausgegeben werden. Man kann dies auf
- mehrere Arten überschreiben:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Setzen von <methodname>throwExceptions()</methodname> im Front
- Controller:
- </para>
- <programlisting language="php"><![CDATA[
- $front->throwExceptions(true);
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- Setzen von <methodname>renderExceptions()</methodname> im Response
- Objekt:
- </para>
- <programlisting language="php"><![CDATA[
- $response->renderExceptions(true);
- $front->setResponse($response);
- $front->dispatch();
- // oder:
- $front->returnResponse(true);
- $response = $front->dispatch();
- $response->renderExceptions(true);
- echo $response;
- ]]></programlisting>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>
- <methodname>Zend_Controller_Dispatcher_Interface::dispatch()</methodname>
- akzeptiert und gibt nun ein <link
- linkend="zend.controller.request">Anfrage Objekt</link> anstelle eines
- Dispatcher Token zurück.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>Zend_Controller_Router_Interface::route()</methodname>
- akzeptiert und gibt nun ein <link
- linkend="zend.controller.request">Anfrage Objekt</link> anstelle eines
- Dispatcher Token zurück.
- </para>
- </listitem>
- <listitem>
- <para><classname>Zend_Controller_Action</classname> Änderungen beinhalten:</para>
- <itemizedlist>
- <listitem>
- <para>
- Der Konstruktur akzeptiert nun genau drei Argumente,
- <classname>Zend_Controller_Request_Abstract</classname>
- <varname>$request</varname>,
- <classname>Zend_Controller_Response_Abstract</classname>
- <varname>$response</varname>, und
- <type>Array</type> <varname>$params</varname> (Optional).
- <methodname>Zend_Controller_Action::__construct()</methodname>
- verwendet diese, um die Request, Response und invokeArgs Eigenschaften
- für das Objekt zu setzen, und beim Überschreiben des Konstrukturs
- sollte man dies ebenfalls tun. Besser ist es, die
- <methodname>init()</methodname> Methode zu verwenden, um jedwede
- Instanzkonfiguration durchzuführen, weil diese Methode als letzte
- Methode des Konstrukturs aufgerufen wird.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>run()</methodname> ist nicht länger als final definiert,
- wird aber auch nicht länger vom Front Controller verwendet; sein
- einziger Zweck ist, dass die Klasse auch als Page Controller verwendet
- werden kann. Sie nimmt nun zwei optionale Argument an, ein
- <classname>Zend_Controller_Request_Abstract</classname>
- <varname>$request</varname> und ein
- <classname>Zend_Controller_Response_Abstract</classname>
- <varname>$response</varname>.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>indexAction()</methodname> muss nicht mehr länger definiert
- werden, aber wird als Standardaktion empfohlen. Dies erlaubt dem
- RewriteRouter und den Action Controllern andere Standardaktionsmethoden
- zu definieren.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>__call()</methodname> sollte überschrieben werden, um jede
- undefinierte Aktion automatisch verarbeiten zu können.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>_redirect()</methodname> nimmt nun ein optionales zweites
- Argument entgegen, den <acronym>HTTP</acronym> Code, der mit dem
- Redirect zurückgegeben werden soll, und ein optionales drittes Argument
- <varname>$prependBase</varname>, das angibt, dass die im Request Objekt
- registrierte Basis URL der übergebenen <acronym>URL</acronym> voran
- gestellt werden soll.
- </para>
- </listitem>
- <listitem>
- <para>
- Die <varname>$_action</varname> Eigenschaft wird nicht mehr gesetzt.
- Diese Eigenschaft war ein
- <classname>Zend_Controller_Dispatcher_Token</classname>, der in der
- aktuellen Inkarnation nicht mehr länger existiert. Der einzige Zweck
- des Tokens war, Informationen über angeforderte Controller, Aktion und
- <acronym>URL</acronym> Parameter bereit zu stellen. Diese Infrmationen
- ist nun im Request Objekt verfügbar und kann wie folgt abgerufen
- werden:
- </para>
- <programlisting language="php"><![CDATA[
- // Hole den angeforderten Controllernamen
- // Der Zugriff erfolgte bisher über: $this->_action->getControllerName().
- // Das Beispiel unten verwendet getRequest(), obwohl man auch direkt auf die
- // $_request Eigenschaft zugreifen kann; die Verwendung von getRequest() wird
- // empfohlen, da eine Elternklasse den Zugriff auf das Request Objekt
- // überschreiben könnte
- $controller = $this->getRequest()->getControllerName();
- // Hole den angeforderten Aktionsnamen
- // Der Zugriff erfolgte bisher über: $this->_action->getActionName().
- $action = $this->getRequest()->getActionName();
- // Hole die Anfrageparameter
- // Dies hat sich nicht verändert; die _getParams() und _getParam()
- // Methoden leiten nun einfach auf das Request Objekt weiter.
- $params = $this->_getParams();
- // fordere den 'foo' Parameter an und verwende
- // 'default', wenn kein Standardwert gefunden werden kann
- $foo = $this->_getParam('foo', 'default');
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <methodname>noRouteAction()</methodname> wurde entfernt. Der geeignete
- Weg, um nicht vorhandene Aktionsmethoden abzufangen, wenn man sie an
- eine Standardaktion weiter leiten möchte, sollte die Verwendung von
- <methodname>__call()</methodname> sein:
- </para>
- <programlisting language="php"><![CDATA[
- public function __call($method, $args)
- {
- // Wenn eine nicht vorhandene 'Action' Methode angefordert wurde,
- // leite auf die Standard Aktionsmethode um:
- if ('Action' == substr($method, -6)) {
- return $this->defaultAction();
- }
- throw new Zend_Controller_Exception('Invalid method called');
- }
- ]]></programlisting>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>
- <methodname>Zend_Controller_RewriteRouter::setRewriteBase()</methodname> wurde
- entfernt. Stattdessen soll
- <methodname>Zend_Controller_Front::setBaseUrl()</methodname> verwendet werden
- (oder <methodname>Zend_Controller_Request_Http::setBaseUrl()</methodname>, wenn
- die Request Klasse verwendet wird).
- </para>
- </listitem>
- <listitem>
- <para>
- <classname>Zend_Controller_Plugin_Interface</classname> wurde durch
- <classname>Zend_Controller_Plugin_Abstract</classname> ersetzt. Alle Methoden
- nehmen nun ein <link linkend="zend.controller.request">Request Objekt</link>
- statt eines Dispatcher Tokens entgegen bzw. geben es zurück.
- </para>
- </listitem>
- </itemizedlist>
- </sect2>
- </sect1>
|