2
0

Zend_Controller-Plugins-ErrorHandler.xml 12 KB

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