File: Zend_Controller-Plugins-ErrorHandler.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (320 lines) | stat: -rw-r--r-- 12,090 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect3 id="zend.controller.plugins.standard.errorhandler">
    <title>Zend_Controller_Plugin_ErrorHandler</title>

    <para>
        <classname>Zend_Controller_Plugin_ErrorHandler</classname> est un plugin intégré par défaut
        pour gérer les exceptions levées par votre application, il sert à gérer les exceptions
        envoyées par l'application, en particulier celles concernant des contrôleurs ou des actions
        manquants. C'est une manière rejoignant la section
        <link linkend="zend.controller.exceptions">Exceptions MVC</link>.
    </para>

    <para>Les principaux objectifs de ce plugin sont&#160;:</para>

    <itemizedlist>
         <listitem>
            <para>Intercepter les exceptions envoyées si aucune route ne correspond</para>
        </listitem>
        <listitem>
            <para>
                Intercepter les exceptions envoyées si un contrôleur ou une action ne peuvent
                être trouvés
            </para>
        </listitem>
        <listitem>
            <para>Intercepte les exceptions envoyées dans les contrôleurs</para>
        </listitem>
    </itemizedlist>

    <para>
        Globalement, <emphasis>ErrorHandler</emphasis> sert à gérer les erreurs
        <acronym>HTTP</acronym> 404 ou 500. Attention, le plugin n'est pas destiné à intervenir sur
        les exceptions envoyées dans d'autres plugins. Des effets de bords peuvent apparaître,
        veillez à les gérer.
    </para>

    <para>
        Par défaut, <classname>Zend_Controller_Plugin_ErrorHandler</classname> redirige vers
        <methodname>ErrorController::errorAction()</methodname> dans le module par défaut. Vous
        pouvez passer d'autres valeurs via les accesseurs du plugin&#160;:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                <methodname>setErrorHandlerModule()</methodname> définit le module à utiliser.
            </para>
        </listitem>
        <listitem>
            <para>
                <methodname>setErrorHandlerController()</methodname> définit le contrôleur à
                utiliser.
            </para>
        </listitem>
        <listitem>
            <para>
                <methodname>setErrorHandlerAction()</methodname> définit l'action à utiliser.
            </para>
        </listitem>
        <listitem>
            <para>
                <methodname>setErrorHandler()</methodname> est un raccourci des trois précédantes.
                Passez un tableau avec les clés "module", "controller", or "action", et leurs
                valeurs appropriées.
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Ce comportement fonctionne aussi avec le constructeur du plugin. Celui-ci agit comme
        un proxy vers <methodname>setErrorHandler()</methodname>.
    </para>

    <para>
        <classname>Zend_Controller_Plugin_ErrorHandler</classname> agit en
        <methodname>postDispatch()</methodname> et analyse
        <link linkend="zend.controller.response">l'objet de réponse</link>à la recherche
        d'éventuelles exceptions. Si il y en a, alors le plugin modifie la requête pour distribuer
        le contrôleur et l'action d'erreur.
    </para>

    <para>
        Si une exception arrive lorsque le plugin agit, alors celui-ci ordonne au contrôleur
        frontal de renvoyer l'exception, et relance la dernière exception enregistrée dans l'objet
        de réponse.
    </para>

    <sect4 id="zend.controller.plugins.standard.errorhandler.fourohfour">
        <title>Utilisation de ErrorHandler pour gérer les erreurs 404</title>

        <para>
            Comme <emphasis>ErrorHandler</emphasis> capture les exceptions relatives à un problème
            de contrôleur ou action manquants, vous pouvez donc l'utiliser comme un gestionnaire
            d'erreurs 404. Pour cela, il faut analyser le type d'exception ayant mené à l'erreur.
        </para>

        <para>
            Les exceptions capturées sont enregistrées en tant que paramètre d'action.
            <methodname>Zend_Controller_Action::_getParam('error_handler')</methodname>:
        </para>

        <programlisting language="php"><![CDATA[
class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');
    }
}
]]></programlisting>

        <para>
            Une fois que vous possédez l'objet contenant l'exception, inspectez son type avec
            <command>$errors->type;</command>. Des constantes sont à votre disposition&#160;:
        </para>

        <itemizedlist>
             <listitem>
                 <para>
                    <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE</constant>,
                    indique qu'aucune route correspondante n'a été trouvée.
                </para>
            </listitem>
            <listitem>
                <para>
                    <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER</constant>,
                    indique un contrôleur non trouvé.
                </para>
            </listitem>
            <listitem>
                <para>
                    <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION</constant>,
                    indique qu'une action est absente.
                </para>
            </listitem>
            <listitem>
                <para>
                    <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER</constant>,
                    indique une autre exception.
                </para>
            </listitem>
        </itemizedlist>

        <para>Les trois premiers types pourraient mener à une erreur 404&#160;:</para>

        <programlisting language="php"><![CDATA[
class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // erreur 404 -- contrôleur ou action introuvable
                $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');

                // ... ici, de l'affichage (du rendu)
                break;
            default:
                // erreur applicative; affiche une page d'erreur,
                // mais sans changer le code de retour HTTP
                break;
        }
    }
}
]]></programlisting>

        <para>
            Enfin, il est possible de récupérer l'exception ayant menée au contrôleur
            d'erreur. Ceci afin de l'analyser. L'attribut <property>exception</property> de
            l'objet <emphasis>error_handler</emphasis> le permet&#160;:
        </para>

        <programlisting language="php"><![CDATA[
public function errorAction()
{
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // erreur 404 -- contrôleur ou action introuvable
                $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');

                // ... ici, de l'affichage (du rendu)
                break;
            default:
                // erreur applicative; affiche une page d'erreur,
                // mais sans changer le code de retour HTTP

                // ...

                // Sauve l'exception en log:
                $exception = $errors->exception;
                $log =
                    new Zend_Log(
                        new Zend_Log_Writer_Stream(
                            '/tmp/applicationException.log')
                    );
                $log->debug($exception->getMessage()
                          . "\n"
                          . $exception->getTraceAsString());
                break;
        }
}
]]></programlisting>
    </sect4>

    <sect4 id="zend.controller.plugins.standard.errorhandler.buffer">
        <title>Gestion des rendus précédants de la réponse</title>

        <para>
            Si vous décomposez vos processus en plusieurs actions ou plusieurs appels à
            <methodname>render()</methodname>, il est possible que la réponse contienne déjà des
            éléments. Ceci peut introduire un mélange entre le rendu attendu et le contenu de
            l'erreur.
        </para>

        <para>
            Si vous désirez rendre votre contrôleur d'erreur dans ce contenu, alors il n'y a
            rien à faire de spécial. En revanche, il peut aussi être judicieux de vider totalement
            la réponse afin de rendre le contrôleur d'erreurs. Procédez alors comme suit&#160;:
        </para>

        <programlisting language="php"><![CDATA[
$this->getResponse()->clearBody();
]]></programlisting>
    </sect4>

    <sect4 id="zend.controller.plugins.standard.errorhandler.examples">
        <title>Exemples d'utilisation</title>

        <example id="zend.controller.plugins.standard.errorhandler.examples.example-1">
            <title>Utilisation standard et désactivation</title>

            <programlisting language="php"><![CDATA[
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler());
]]></programlisting>
        </example>

        <example id="zend.controller.plugins.standard.errorhandler.examples.example-2">
            <title>Paramétrage du plugin</title>

            <programlisting language="php"><![CDATA[
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(array(
    'module'     => 'mystuff',
    'controller' => 'static',
    'action'     => 'error'
)));
]]></programlisting>
        </example>

        <example id="zend.controller.plugins.standard.errorhandler.examples.example-3">
            <title>Utilisation des accesseurs</title>

            <programlisting language="php"><![CDATA[
$plugin = new Zend_Controller_Plugin_ErrorHandler();
$plugin->setErrorHandlerModule('mystuff')
       ->setErrorHandlerController('static')
       ->setErrorHandlerAction('error');

$front = Zend_Controller_Front::getInstance();
$front->registerPlugin($plugin);
]]></programlisting>
        </example>
    </sect4>

    <sect4 id="zend.controller.plugins.standard.errorhandler.controllerexamples">
        <title>Exemple de contrôleur d'erreurs</title>

        <para>
            Pour utiliser le plugin de gestion d'erreurs, un contrôleur d'erreurs est
            requis. En voici un exemple&#160;:
        </para>

        <programlisting language="php"><![CDATA[
class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
                // 404 error -- controller or action not found
                $this->getResponse()->setRawHeader('HTTP/1.1 404 Not Found');

                $content =<<<EOH
<h1>Erreur !</h1>
<p>Page introuvable.</p>
EOH;
                break;
            default:
                // application error
                $content =<<<EOH
<h1>Erreur !</h1>
<p>Une erreur innatendue est survenue</p>
EOH;
                break;
        }

        // Vide le contenu de la réponse
        $this->getResponse()->clearBody();

        $this->view->content = $content;
    }
}
]]></programlisting>
    </sect4>
</sect3>