Zend_Controller-Plugins-ErrorHandler.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 17175 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.plugins.standard.errorhandler">
  5. <title>Zend_Controller_Plugin_ErrorHandler</title>
  6. <para>
  7. <classname>Zend_Controller_Plugin_ErrorHandler</classname> bietet ein Plugin für die
  8. Handhabung von Ausnahmen die von der Anwendung geworfen werden, inklusive denen die aus
  9. fehlenden Controllern oder Aktionen resultieren; das ist eine Alternative zu den Methoden
  10. die in der <link linkend="zend.controller.exceptions">Sektion MVC Ausnahmen</link>
  11. aufgeführt sind.
  12. </para>
  13. <para>
  14. Die primären Ziele dieses Plugins sind:
  15. </para>
  16. <itemizedlist>
  17. <listitem>
  18. <para>
  19. Abfangen von Ausnahmen die durch fehlende Controller oder Aktionsmethoden auftreten
  20. </para>
  21. </listitem>
  22. <listitem>
  23. <para>Abfangen von Ausnahmen die innerhalb von Controllern aufrufen</para>
  24. </listitem>
  25. </itemizedlist>
  26. <para>
  27. Mit anderen Worten ist das <emphasis>ErrorHandler</emphasis> Plugin kreiert worden um
  28. <acronym>HTTP</acronym> 404 Fehler zu behandeln (fehlende Seite) und 500 Fehler (interner
  29. Fehler). Es ist nicht dazu gedacht Ausnahmen zu fangen die in anderen Plugins oder durch das
  30. Routen verursacht werden.
  31. </para>
  32. <para>
  33. Standardmäßig leitet <classname>Zend_Controller_Plugin_ErrorHandler</classname> auf
  34. <methodname>ErrorController::errorAction()</methodname> im Standardmodul weiter. Es kann
  35. ein alternativer Wert für dieses gesetzt werden durch Verwendung der diversen
  36. Zugriffsmethoden die zu dem Plugin existieren:
  37. </para>
  38. <itemizedlist>
  39. <listitem>
  40. <para>
  41. <methodname>setErrorHandlerModule()</methodname> setzt das Controller Modul das
  42. verwendet werden soll.
  43. </para>
  44. </listitem>
  45. <listitem>
  46. <para>
  47. <methodname>setErrorHandlerController()</methodname> setzt den Controller der
  48. verwendet werden soll.
  49. </para>
  50. </listitem>
  51. <listitem>
  52. <para>
  53. <methodname>setErrorHandlerAction()</methodname> setzt die Controller Aktion die
  54. verwendet werden soll.
  55. </para>
  56. </listitem>
  57. <listitem>
  58. <para>
  59. <methodname>setErrorHandler()</methodname> nimmt ein assoziatives Array, welches
  60. einen der Schlüssel 'module', 'controller', oder 'action' enthalten kann und mit
  61. denen es die gewünschten Werte setzt.
  62. </para>
  63. </listitem>
  64. </itemizedlist>
  65. <para>
  66. Zusätzlich kann ein optionales assoziatives Array an den Konstruktor übergeben werden,
  67. welches dann an den <methodname>setErrorHandler()</methodname> weitergeleitet wird.
  68. </para>
  69. <para>
  70. <classname>Zend_Controller_Plugin_ErrorHandler</classname> benötigt einen
  71. <methodname>postDispatch()</methodname> Hook und prüft auf Ausnahmen die im <link
  72. linkend="zend.controller.response">Antwort Objekt</link> registriert sind. Wenn welche
  73. gefunden werden, versucht es zur registrieren Fehler Handler Aktion weiterzuleiten.
  74. </para>
  75. <para>
  76. Wenn eine Ausnahme wärend der Abarbeitung des Error Handlers auftritt, teilt das Plugin dem
  77. Front Controller mit das eine Ausnahme geworfen werden muß, und die letzte registrierte
  78. Ausnahme im Antwort Objekt wird nocheinmal geworfen.
  79. </para>
  80. <sect4 id="zend.controller.plugins.standard.errorhandler.fourohfour">
  81. <title>Den Fehler Handler als 404 Handler verwenden</title>
  82. <para>
  83. Da das <emphasis>ErrorHandler</emphasis> Plugin nicht nur Anwendungsfehler erfasst,
  84. sondern auch Fehler in der Controller Kette die durch fehlende Controller Klassen
  85. und/oder Aktions Methoden auftreten, kann es als 404 Handler verwendet werden. Hierfür
  86. muß der eigene Fehler Controller den Typ der Ausnahme prüfen.
  87. </para>
  88. <para>
  89. Aufgefangene Ausnahmen werden in einem in der Anfrage registrierten Objekt geloggt. Um
  90. dieses zu empfangen kann
  91. <methodname>Zend_Controller_Action::_getParam('error_handler')</methodname> verwendet
  92. werden:
  93. </para>
  94. <programlisting language="php"><![CDATA[class ErrorController extends Zend_Controller_Action
  95. {
  96. public function errorAction()
  97. {
  98. $errors = $this->_getParam('error_handler');
  99. }
  100. }
  101. ]]></programlisting>
  102. <para>
  103. Sobald das Fehler Objekt vorhanden ist, kann man es über den Typ mit
  104. <command>$errors->type;</command> erhalten. Es wird eines der folgenden sein:
  105. </para>
  106. <itemizedlist>
  107. <listitem>
  108. <para>
  109. <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER</constant>,
  110. zeigt das der Controller nicht gefunden wurde.
  111. </para>
  112. </listitem>
  113. <listitem>
  114. <para>
  115. <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION</constant>,
  116. zeigt das die angefragte Aktion nicht gefunden wurde.
  117. </para>
  118. </listitem>
  119. <listitem>
  120. <para>
  121. <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER</constant>,
  122. zeigt andere Ausnahmen.
  123. </para>
  124. </listitem>
  125. </itemizedlist>
  126. <para>
  127. Man kann auf eine der ersten Typen testen, und wenn dem so ist, eine 404 Seite anzeigen:
  128. </para>
  129. <programlisting language="php"><![CDATA[
  130. class ErrorController extends Zend_Controller_Action
  131. {
  132. public function errorAction()
  133. {
  134. $errors = $this->_getParam('error_handler');
  135. switch ($errors->type) {
  136. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  137. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  138. // 404 Fehler -- Controller oder Aktion nicht gefunden
  139. $this->getResponse()
  140. ->setRawHeader('HTTP/1.1 404 Not Found');
  141. // ... Ausgabe für die Anzeige erzeugen...
  142. break;
  143. default:
  144. // Anwendungsfehler; Fehler Seite anzeigen, aber den
  145. // Status Code nicht ändern
  146. break;
  147. }
  148. }
  149. }
  150. ]]></programlisting>
  151. <para>
  152. Letztendlich kann die Anwendung die den Fehler Handler verursacht hat, empfangen werden
  153. indem die <property>exception</property> Eigenschaft des
  154. <emphasis>error_handler</emphasis> Objektes genommen wird:
  155. </para>
  156. <programlisting language="php"><![CDATA[
  157. public function errorAction()
  158. {
  159. $errors = $this->_getParam('error_handler');
  160. switch ($errors->type) {
  161. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  162. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  163. // 404 Fehler -- Controller oder Aktion nicht gefunden
  164. $this->getResponse()
  165. ->setRawHeader('HTTP/1.1 404 Not Found');
  166. // ... Ausgabe für die Anzeige erzeugen...
  167. break;
  168. default:
  169. // Anwendungsfehler; Fehler Seite anzeigen, aber den
  170. // Status Code nicht ändern
  171. // ...
  172. // Ausnahme loggen:
  173. $exception = $errors->exception;
  174. $log = new Zend_Log(
  175. new Zend_Log_Writer_Stream(
  176. '/tmp/applicationException.log'
  177. )
  178. );
  179. $log->debug($exception->getMessage() . "\n" .
  180. $exception->getTraceAsString());
  181. break;
  182. }
  183. }
  184. ]]></programlisting>
  185. </sect4>
  186. <sect4 id="zend.controller.plugins.standard.errorhandler.buffer">
  187. <title>Zuvor gerenderte Ausgaben erhalten</title>
  188. <para>
  189. Wenn mehrfache Aktionen in einer Anfrage behandelt werden, oder wenn die Aktion mehrere
  190. Aufrufe zu <methodname>render()</methodname> macht, ist es möglich das das Antwort
  191. Objekt bereits Inhalt in sich gespeichert hat. Das kann dazu führen das eine Mixtur von
  192. erwartetem Inhalt und Fehler Inhalt gerendert wird.
  193. </para>
  194. <para>
  195. Wenn Fehler innerhalb solcher Seiten gerendert werden, ist keine Änderung notwendig.
  196. Wenn solche Inhalte nicht gerendert werden sollen, muß der Antwort Body vor dem rendern
  197. jeglicher Views gelöscht werden:
  198. </para>
  199. <programlisting language="php"><![CDATA[
  200. $this->getResponse()->clearBody();
  201. ]]></programlisting>
  202. </sect4>
  203. <sect4 id="zend.controller.plugins.standard.errorhandler.examples">
  204. <title>Beispiele für die Verwendung des Plugins</title>
  205. <example id="zend.controller.plugins.standard.errorhandler.examples.example-1">
  206. <title>Standardverwendung</title>
  207. <programlisting language="php"><![CDATA[
  208. $front = Zend_Controller_Front::getInstance();
  209. $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
  210. ]]></programlisting>
  211. </example>
  212. <example id="zend.controller.plugins.standard.errorhandler.examples.example-2">
  213. <title>Einen anderen Fehler Handler setzen</title>
  214. <programlisting language="php"><![CDATA[
  215. $front = Zend_Controller_Front::getInstance();
  216. $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
  217. 'module' => 'mystuff',
  218. 'controller' => 'static',
  219. 'action' => 'error'
  220. )));
  221. ]]></programlisting>
  222. </example>
  223. <example id="zend.controller.plugins.standard.errorhandler.examples.example-3">
  224. <title>Zugriffsmethoden verwenden</title>
  225. <programlisting language="php"><![CDATA[
  226. $plugin = new Zend_Controller_Plugin_ErrorHandler();
  227. $plugin->setErrorHandlerModule('mystuff')
  228. ->setErrorHandlerController('static')
  229. ->setErrorHandlerAction('error');
  230. $front = Zend_Controller_Front::getInstance();
  231. $front->registerPlugin($plugin);
  232. ]]></programlisting>
  233. </example>
  234. </sect4>
  235. <sect4 id="zend.controller.plugins.standard.errorhandler.controllerexamples">
  236. <title>Beispiel für den Fehler Controller</title>
  237. <para>
  238. Um das Fehler Handler Plugin zu verwenden, benötigt man einen Fehler Controller.
  239. Nachfolgend ist ein einfaches Beispiel.
  240. </para>
  241. <programlisting language="php"><![CDATA[
  242. class ErrorController extends Zend_Controller_Action
  243. {
  244. public function errorAction()
  245. {
  246. $errors = $this->_getParam('error_handler');
  247. switch ($errors->type) {
  248. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
  249. case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
  250. // 404 Fehler -- Controller oder Aktion nicht gefunden
  251. $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
  252. $content =<<<EOH
  253. <h1>Error!</h1>
  254. <p>Die angefragte Seite konnte nicht gefunden werden.</p>
  255. EOH;
  256. break;
  257. default:
  258. // Anwendungsfehler
  259. $content =<<<EOH
  260. <h1>Fehler!</h1>
  261. <p>Ein unerwarteter Fehler trat auf.
  262. Bitte versuchen Sie es etwas später nocheinmal.</p>
  263. EOH;
  264. break;
  265. }
  266. // Vorherige Inhalte löschen
  267. $this->getResponse()->clearBody();
  268. $this->view->content = $content;
  269. }
  270. }
  271. ]]></programlisting>
  272. </sect4>
  273. </sect3>
  274. <!--
  275. vim:se ts=4 sw=4 et:
  276. -->