[ZF-10089] Zend_Log
[zend.git] / documentation / manual / ru / module_specs / Zend_Controller-Plugins-ErrorHandler.xml
blob6dafe6e9eba953b13295e9aacea52d236a750c2a
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <sect3 id="zend.controller.plugins.standard.errorhandler">
4     <title>Zend_Controller_Plugins_ErrorHandler</title>
6     <para>
7         <classname>Zend_Controller_Plugins_ErrorHandler</classname> представляет собой
8         плагин для обработки исключений, брошенных вашим приложением, включая
9         те, которые вызваны отсутствием запрошенного контроллера или
10         действия. Он является альтернативой способам, перечисленным в <link
11         linkend="zend.controller.exceptions">разделе об исключениях MVC</link>.
12     </para>
14     <para>
15         Основные назначения этого плагина:
16     </para>
18     <itemizedlist>
19         <listitem>
20             <para>
21                 Перехват исключений, вызванных отсутствием контроллера или
22                 метода действия
23             </para>
24         </listitem>
26         <listitem>
27             <para>
28                 Перехват исключений, брошенных в контроллерах действий
29             </para>
30         </listitem>
31     </itemizedlist>
33     <para>
34         Другими словами, плагин ErrorHandler спроектирован для обработки
35         HTTP-ошибок типа 404 (отсутствует страница) и 500
36         (внутренняя ошибка). Он не предназначен для отлова исключений,
37         сгенерированных в других плагинах или в процессе маршрутизации.
38     </para>
40     <para>
41         По умолчанию <classname>Zend_Controller_Plugins_ErrorHandler</classname> будет
42         производить переход к
43         <code>ErrorController::errorAction()</code> в модуле по умолчанию. Вы
44         можете установить альтернативные значения для перехода, используя
45         набор методов-аксессоров, доступных в плагине:
46     </para>
48     <itemizedlist>
49         <listitem>
50             <para>
51                 <code>setErrorHandlerModule()</code> устанавливает модуль, на
52                 который производится переход.
53             </para>
54         </listitem>
56         <listitem>
57             <para>
58                 <code>setErrorHandlerController()</code> устанавливает
59                 контроллер, на который производится переход.
60             </para>
61         </listitem>
63         <listitem>
64             <para>
65                 <code>setErrorHandlerAction()</code> устанавливает действие,
66                 на которое производится переход.
67             </para>
68         </listitem>
70         <listitem>
71             <para>
72                 <code>setErrorHandler()</code> принимает ассоциативный массив,
73                 который может содержать любые из ключей 'module', 'controller'
74                 или 'action'.
75             </para>
76         </listitem>
77     </itemizedlist>
79     <para>
80         Кроме этого, вы можете опционально передать конструктору
81         ассоциативный массив, который будет в свою очередь передан
82         <code>setErrorHandler()</code>.
83     </para>
85     <para>
86         <classname>Zend_Controller_Plugin_ErrorHandler</classname> регистрирует
87         перехватчик <code>postDispatch()</code> и проверяет, есть ли
88         зарегистрированые исключения в
89         <link linkend="zend.controller.response">объекте ответа</link>.
90         Если есть, то производится попытка перехода на действие,
91         зарегистрированное в качестве обработчика ошибок.
92     </para>
94     <para>
95         Если во время диспетчеризации обработчика ошибок произошло исключение,
96         то плагин скажет фронт-контроллеру, чтобы тот бросил исключения, и
97         повторно бросит последнее исключение, зарегистрированное в объекте
98         ответа.
99     </para>
101     <sect4 id="zend.controller.plugins.standard.errorhandler.fourohfour">
102         <title>Использование ErrorHandler в качестве обработчика ошибки 404</title>
104         <para>
105             Поскольку плагин захватывает не только ошибки приложения, но и
106             ошибки в цепочке контроллеров, вызванные отсутствием класса
107             контроллера и/или метода действия, то он может использоваться в
108             качестве обработчика ошибки 404. В этом случае нужно, чтобы
109             ваш контроллер ошибок проверял тип исключения.
110         </para>
112         <para>
113             Перехваченные исключения журналируются в объекте, зарегистрированном
114             в запросе. Для его получения используйте метод
115             <code>Zend_Controller_Action::_getParam('error_handler')</code>:
116         </para>
118         <programlisting language="php"><![CDATA[
119 class ErrorController extends Zend_Controller_Action
121     public function errorAction()
122     {
123         $errors = $this->_getParam('error_handler');
124     }
126 ]]></programlisting>
128         <para>
129             Имея объект ошибки, вы можете получить тип ошибки через
130             <varname>$errors->type</varname>. Тип ошибки может быть одним из
131             следующих:
132         </para>
134         <itemizedlist>
135             <listitem>
136                 <para>
137                     <code>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER</code>,
138                     означает, что контроллер не был найден.
139                 </para>
140             </listitem>
142             <listitem>
143                 <para>
144                     <code>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION</code>,
145                     означает, что запрошенное действие не было найдено.
146                 </para>
147             </listitem>
149             <listitem>
150                 <para>
151                     <code>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER</code>,
152                     обозначает другие исключения.
153                 </para>
154             </listitem>
155         </itemizedlist>
157         <para>
158             Вы можете производить проверку на первые два типа и в случае
159             положительного ответа указывать страницу 404:
160         </para>
162         <programlisting language="php"><![CDATA[
163 class ErrorController extends Zend_Controller_Action
165     public function errorAction()
166     {
167         $errors = $this->_getParam('error_handler');
169         switch ($errors->type) {
170             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
171             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
172                 // ошибка 404 - не найден контроллер или действие
173                 $this->getResponse()
174                      ->setRawHeader('HTTP/1.1 404 Not Found');
176                 // ... получение данных для отображения...
177                 break;
178             default:
179                 // ошибка приложения; выводим страницу ошибки,
180                 // но не меняем код статуса
181                 break;
182         }
183     }
185 ]]></programlisting>
187         <para>
188             Вы можете извлекать исключение, которое инициировало вызов
189             обработчика ошибок, через свойство <code>exception</code> объекта
190             <code>error_handler</code>:
191         </para>
193         <programlisting language="php"><![CDATA[
194 public function errorAction()
196         $errors = $this->_getParam('error_handler');
198         switch ($errors->type) {
199             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
200             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
201                 // ошибка 404 - не найден контроллер или действие
202                 $this->getResponse()
203                      ->setRawHeader('HTTP/1.1 404 Not Found');
205                 // ... получение данных для отображения...
206                 break;
207             default:
208                 // ошибка приложения; выводим страницу ошибки,
209                 // но не меняем код статуса
211                 // ...
213                 // Журналируем исключение:
214                 $exception = $errors->exception;
215                 $log = new Zend_Log(
216                     new Zend_Log_Writer_Stream(
217                         '/tmp/applicationException.log'
218                     )
219                 );
220                 $log->debug($exception->getMessage() . "\n" .
221                             $exception->getTraceAsString());
222                 break;
223         }
225 ]]></programlisting>
226     </sect4>
228     <sect4 id="zend.controller.plugins.standard.errorhandler.buffer">
229         <title>Управление сгенерированным ранее выводом</title>
231         <para>
232             Если в процессе обработки запроса вызывается несколько действий,
233             или ваше действие несколько раз вызывает метод
234             <code>render()</code>, то возможно, что объект ответа уже содержит
235             в себе сохраненные данные для вывода. Это может привести к тому, что
236             выведется смесь из ожидаемого содержимого и содержимого
237             ошибки.
238         </para>
240         <para>
241             Если вы хотите, чтобы сообщения об ошибках выводились на этих же
242             страницах, то нет необходимости что-либо менять. В противном случае
243             следует очистить тело ответа до того, как производить рендеринг
244             каких-либо видов:
245         </para>
247         <programlisting language="php"><![CDATA[
248 $this->getResponse()->clearBody();
249 ]]></programlisting>
250     </sect4>
252     <sect4 id="zend.controller.plugins.standard.errorhandler.examples">
253         <title>Примеры использования плагина</title>
255         <example id="zend.controller.plugins.standard.errorhandler.examples.example-1">
256             <title>Стандартное использование</title>
257             <programlisting language="php"><![CDATA[
258 $front = Zend_Controller_Front::getInstance();
259 $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
260 ]]></programlisting>
261         </example>
263         <example id="zend.controller.plugins.standard.errorhandler.examples.example-2">
264             <title>Установка другого обработчика ошибок</title>
265             <programlisting language="php"><![CDATA[
266 $front = Zend_Controller_Front::getInstance();
267 $front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
268     'module'     => 'mystuff',
269     'controller' => 'static',
270     'action'     => 'error'
271 )));
272 ]]></programlisting>
273         </example>
275         <example id="zend.controller.plugins.standard.errorhandler.examples.example-3">
276             <title>Использование аксессоров</title>
277             <programlisting language="php"><![CDATA[
278 $plugin = new Zend_Controller_Plugin_ErrorHandler();
279 $plugin->setErrorHandlerModule('mystuff')
280        ->setErrorHandlerController('static')
281        ->setErrorHandlerAction('error');
283 $front = Zend_Controller_Front::getInstance();
284 $front->registerPlugin($plugin);
286             </programlisting>
287         </example>
288     </sect4>
290     <sect4 id="zend.controller.plugins.standard.errorhandler.controllerexamples">
291         <title>Пример контроллера ошибок</title>
293         <para>
294             Для того, чтобы использовать плагин ErrorHandler, нужен контроллер
295             ошибок. Ниже приводится простой пример такого контроллера.
296         </para>
298         <programlisting language="php"><![CDATA[
299 class ErrorController extends Zend_Controller_Action
301     public function errorAction()
302     {
303         $errors = $this->_getParam('error_handler');
305         switch ($errors->type) {
306             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
307             case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
308                 // ошибка 404 - не найден контроллер или действие
309                 $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');
311                 $content =<<<EOH
312 <h1>Ошибка!</h1>
313 <p>Запрошенная вами страница не найдена.</p>
314 EOH;
315                 break;
316             default:
317                 // ошибка приложения
318                 $content =<<<EOH
319 <h1>Ошибка!</h1>
320 <p>Произошла непредвиденная ошибка. Пожалуйста, попробуйте позднее.</p>
321 EOH;
322                 break;
323         }
325         // Удаление добавленного ранее содержимого
326         $this->getResponse()->clearBody();
328         $this->view->content = $content;
329     }
331 ]]></programlisting>
332     </sect4>
333 </sect3>
334 <!--
335 vim:se ts=4 sw=4 et: