Caution: You are browsing the legacy symfony 1.x part of this website.

Como personalizar templates de Erro

1.2
Language

Quando um erro ocorre, seja um erro de pagina não encontrada, o erro interno do servidor, ou qualquer outra exceção o symfony mostra uma pagina de erro. O conteúdo da pagina depende do ambiente e do formato da requisição.

Vamos ver um exemplo para explicar melhor. Tendo uma aplicação com um módulo API que retorna representações HTML, XML or JSN do modelo Article.

Aqui esta a configuração de roteamento que faz isso funcionar:

// apps/frontend/config/routing.yml
api_article:
  url:   /api/article/:id.:sf_format
  param: { module: api, action: article }
  requirements:
    sf_format: (?:html|xml|json)

e o módulo associado:

class apiActions extends sfActions
{
  public function executeArticle($request)
  {
    $this->article = ArticlePeer::retrieveByPK($request->getParameter('id'));
 
    $this->forward404Unless($this->article);
  }
 
  // ...
}

Se você passar um id não existente na requisição, a ação é encaminhada para a pagina de erro 404. Se você o formato HTML (http://localhost/frontend_dev.php/api/article/1.html) em ambiente de desenvolvimento, você vai receber uma mensagem de erro como essa:

404.html in the development environment

Em ambiente de produção (http://localhost/frontend_dev.php/api/article/1.html), a pagina é bem diferente, por razões óbvias de segurança:

404.html in the production environment

Agora vamos ver como isso se comporta se mudarmos o formato para XML no ambiente de desenvolvimento (http://localhost/frontend_dev.php/api/article/1.xml):

404.xml in the development environment

E agora, no ambiente de produção (http://localhost/api/article/1.xml):

404.xml in the production environment

Como você mesmo pode ver, a mensagem de erro retornado pelo symfony esta agora no formato requisitado, XML.

Esse exemplo demonstra como as mensagens são personalizadas para uma pagina 404, mas o mesmo acontece para qualquer outra exceção não capturada.

Você sempre pode personalizar a saída de cada formato adicionando um template no diretório de seu projeto (config/error/) ou no diretório da aplicação (apps/frontend/config/error/).

Por exemplo, para personalizar a saída XML de mensagens de erro, crie um arquivo config/error/error.xml.php. O symfony é esperto o suficiente para usar o template personalizado se ele existir, ao invés do padrão:

<?xml version="1.0" encoding="<?php echo sfConfig::get('sf_charset', 'UTF-8') ?>"?>
<error>
   <code><?php echo $code ?></code>
   <message><?php echo $text ?></message>
</error>

404.xml customized in the production environment

Quando você personaliza um template de mensagem de erro, você tem acesso as seguintes variáveis:

  • $code: O código de status da resposta(response)
  • $text: O texto do status da resposta(response)
  • $name: O nome da classe da Exceção
  • $message: A mensagem da Exceção
  • $traces: Um array contendo todo o trace PHP
  • $format: O formato requisitado

É também possível personalizar a saida do ambiente de desenvolvimento, mesmo que isso não seja muito interessante, criando um arquivo config/error/exception.xml.php.

Os templates padrão são armazenados no diretório lib/exception/data/ da instalação do symfony e um bom ponto de inicio para customizar templates.

Quando você criar seu próprio formato, você vai precisar criar os templates de mensagens de erro apropriados (config/error/error.FORMAT_NAME.php e config/error/exception.FORMAT_NAME.php).

Para facilitar essa tarefa, você pode incluir um template de erro existente. Por exemplo, se o seu formato é tipo XML você pode incluir o template de mensagem de erro XML padrão:

<?php include sfException::getTemplatePathForError('xml', true) ?>

Suporte a formato é mais outro exemplo de que o symfony 1.2 esta abraçando o HTTP o quanto for possível.