Zend_Controller-Plugins-ErrorHandler.xml 12 KB

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