2.2 ErrorController

Controlador de Erros

Sempre que o sistema encontra um erro pelo caminho (Exception) é lançada em primeiro lugar o ErrorController dentro do módulo onde o usuário está, se não existir ele lança o ErrorController padrão do SuitUp em src/ModuleError/Controllers/ErrorController.php. Implementar um ErrorController dentro de seu módulo lhe permite personalizar as páginas de erros do sistema.

Como fazer?

  • Criar a classe de controlador com o nome reservado ErrorController dentro do módulo;
  • Criar a view ModuleDefault/views/error/error.phtml para erros em geral;
  • Criar o view ModuleDefault/views/error/not-found.phtml para erros de página não encontrada;
  • Este erro é lançado caso o módulo, o controlador, a ação ou a view não seja encontrado.

Controlador

Basta criar um controlador com o nome reservado ErrorController que extende ao AbstractController ou MvcAbstractController, neste arquivo não precisa criar nenhum método, mas você pode sobrescrever o método init para definir um layout específico para erros. Você também pode sobrescrever os métodos errorAction e notFoundAction caso queira por exemplo criar um log antes de disparar a view.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
// File: ModuleDefault/Controllers/ErrorController.php

namespace ModuleDefault\Controllers;

class ErrorController extends AbstractController
{
    public function init() {

        // Com esta linha o sistema utilizará este arquivo como layout em vez do padrão do módulo.
        // claro que para isto o arquivo `ModuleDefault/views/error/layout.phtml` deve existir.
        $this->setLayout("error/layout.phtml");
    }
}

Para entender melhor o que nós chamamos de layout [[clique aqui|3. Layouts]]

Views

Obviamente que os erros são muito importantes dentro de um sistema para gerenciar o que está e o que não está dando certo, por isso deixamos assim tão fácil acompanhar os erros dentro do SuitUp. Mas por outro lado não faz nenhum sentido mostrar as exceptions para o usuário, além de ser também uma falha de segurança, por isso usamos o if DEVELOPMENT dentro da view. Isso faz com que a descrição da Exception seja mostrada somente em ambiente de desenvolvimento.

Automaticamente a variável $exception estará disponível na view com todas as informações sobre o erro ocorrido.

Segue uma dica de montagem do html desses arquivos.

ModuleDefault/views/error/error.phtml

 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
<div class="page-header">
    <h1>Ops, houve um erro inesperado.</h1>
</div>
<?php if (DEVELOPMENT && isset($exception)): ?>
    <div class="panel panel-primary">
        <div class="panel-heading">Erro do Sistema</div>
        <table class="table table-striped">
            <thead>
                <tr>
                    <td>Mensagem: </td>
                    <td><?php echo $exception->getMessage(); ?></td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>Arquivo: </td>
                    <td><?php echo $exception->getFile(); ?> :: (( <b><?php echo $exception->getLine(); ?></b> ))</td>
                </tr>
                <?php if ($exception->getTrace()): ?>
                    <tr>
                        <td>Stack Trace: </td>
                        <td>
                            <div class="row">
                                <?php foreach ($exception->getTrace() as $key => $trace): ?>
                                    <div class="col-sm-4">
                                        <div class="panel panel-default">
                                            <div class="panel-heading">#<?php echo $key; ?></div>
                                            <div class="panel-body">
                                                <?php if ($trace['args']): ?>
                                                    <?php echo $trace['function']; ?>('<?php echo implode("','", $trace['args']); ?>');
                                                <?php else: ?>
                                                    <?php echo $trace['function']; ?>();
                                                <?php endif; ?>
                                                <br/>
                                                <br/>
                                                Arquivo: <?php echo $trace['file']; ?>::(<?php echo $trace['line']; ?>)
                                            </div>
                                        </div>
                                    </div>
                                <?php endforeach; ?>
                            </div>
                        </td>
                    </tr>
                <?php endif; ?>
            </tbody>
            <tfoot>
                <tr>
                    <td>String: </td>
                    <td><div class="well well-sm"><?php echo nl2br($exception->__toString()); ?></div></td>
                </tr>
            </tfoot>
        </table>
    </div>
<?php endif; ?>
<p>
    <a href="/">Voltar ao início ;)</a>
</p>

ModuleDefault/views/error/not-found.phtml

 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
<h1>Página Não Encontrada</h1>
<?php if (DEVELOPMENT && isset($exception)): ?>
    <div class="panel panel-primary">
        <div class="panel-heading">Erro do Sistema</div>
        <table class="table table-striped">
            <thead>
                <tr>
                    <td>Mensagem: </td>
                    <td><?php echo $exception->getMessage(); ?></td>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>Arquivo: </td>
                    <td><?php echo $exception->getFile(); ?> :: (( <b><?php echo $exception->getLine(); ?></b> ))</td>
                </tr>
                <?php if ($exception->getTrace()): ?>
                    <tr>
                        <td>Stack Trace: </td>
                        <td>
                            <div class="row">
                                <?php foreach($exception->getTrace() as $key => $trace): ?>
                                    <div class="col-sm-4">
                                        <div class="panel panel-default">
                                            <div class="panel-heading">#<?php echo $key; ?></div>
                                            <div class="panel-body">
                                                <?php if ($trace['args']): ?>
                                                    <?php echo $trace['function']; ?>('<?php echo implode("','", $trace['args']); ?>');
                                                <?php else: ?>
                                                    <?php echo $trace['function']; ?>();
                                                <?php endif; ?>
                                                <br/>
                                                <br/>
                                                Arquivo: <?php echo $trace['file']; ?>::(<?php echo $trace['line']; ?>)
                                            </div>
                                        </div>
                                    </div>
                                <?php endforeach; ?>
                            </div>
                        </td>
                    </tr>
                <?php endif; ?>
            </tbody>
            <tfoot>
                <tr>
                    <td>String: </td>
                    <td><div class="well well-sm"><?php echo nl2br($exception->__toString()); ?></div></td>
                </tr>
            </tfoot>
        </table>
    </div>
<?php endif; ?>
<p>
    <a href="/">Voltar ao início ;)</a>
</p>